Merge ~barryprice/swoffsite-charms/+git/swoffsite-charm:master into ~swoffsite-charmers/swoffsite-charms/+git/swoffsite-charm:master
- Git
- lp:~barryprice/swoffsite-charms/+git/swoffsite-charm
- master
- Merge into master
Proposed by
Barry Price
Status: | Merged |
---|---|
Merged at revision: | 31dce45b74a38d359f2ec6c360569ebf59a09235 |
Proposed branch: | ~barryprice/swoffsite-charms/+git/swoffsite-charm:master |
Merge into: | ~swoffsite-charmers/swoffsite-charms/+git/swoffsite-charm:master |
Diff against target: |
265 lines (+40/-24) 3 files modified
dev/null (+0/-7) swoffsite/swoffsite/cli.py (+5/-2) swoffsite/swoffsite/mirror.py (+35/-15) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Haw Loeung | +1 | Approve | |
Review via email: mp+453393@code.launchpad.net |
Commit message
Run 'make sync' to update swoffsite itself for keystone v3 support
Description of the change
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 | diff --git a/swoffsite/.bzr/README b/swoffsite/.bzr/README | |||
2 | 0 | deleted file mode 100644 | 0 | deleted file mode 100644 |
3 | index f82dc1c..0000000 | |||
4 | --- a/swoffsite/.bzr/README | |||
5 | +++ /dev/null | |||
6 | @@ -1,3 +0,0 @@ | |||
7 | 1 | This is a Bazaar control directory. | ||
8 | 2 | Do not change any files in this directory. | ||
9 | 3 | See http://bazaar.canonical.com/ for more information about Bazaar. | ||
10 | diff --git a/swoffsite/.bzr/branch-format b/swoffsite/.bzr/branch-format | |||
11 | 4 | deleted file mode 100644 | 0 | deleted file mode 100644 |
12 | index 9eb09b7..0000000 | |||
13 | --- a/swoffsite/.bzr/branch-format | |||
14 | +++ /dev/null | |||
15 | @@ -1 +0,0 @@ | |||
16 | 1 | Bazaar-NG meta directory, format 1 | ||
17 | diff --git a/swoffsite/.bzr/branch/branch.conf b/swoffsite/.bzr/branch/branch.conf | |||
18 | 2 | deleted file mode 100644 | 0 | deleted file mode 100644 |
19 | index aace28c..0000000 | |||
20 | --- a/swoffsite/.bzr/branch/branch.conf | |||
21 | +++ /dev/null | |||
22 | @@ -1 +0,0 @@ | |||
23 | 1 | parent_location = bzr+ssh://bazaar.launchpad.net/+branch/swoffsite/ | ||
24 | diff --git a/swoffsite/.bzr/branch/format b/swoffsite/.bzr/branch/format | |||
25 | 2 | deleted file mode 100644 | 0 | deleted file mode 100644 |
26 | index dc392f4..0000000 | |||
27 | --- a/swoffsite/.bzr/branch/format | |||
28 | +++ /dev/null | |||
29 | @@ -1 +0,0 @@ | |||
30 | 1 | Bazaar Branch Format 7 (needs bzr 1.6) | ||
31 | diff --git a/swoffsite/.bzr/branch/last-revision b/swoffsite/.bzr/branch/last-revision | |||
32 | 2 | deleted file mode 100644 | 0 | deleted file mode 100644 |
33 | index ee0a4d1..0000000 | |||
34 | --- a/swoffsite/.bzr/branch/last-revision | |||
35 | +++ /dev/null | |||
36 | @@ -1 +0,0 @@ | |||
37 | 1 | 43 mergebot@juju-139df4-prod-is-toolbox-0.canonical.com-20190523063027-99vwgfct7fj0eo1z | ||
38 | diff --git a/swoffsite/.bzr/branch/tags b/swoffsite/.bzr/branch/tags | |||
39 | 2 | deleted file mode 100644 | 0 | deleted file mode 100644 |
40 | index e69de29..0000000 | |||
41 | --- a/swoffsite/.bzr/branch/tags | |||
42 | +++ /dev/null | |||
43 | diff --git a/swoffsite/.bzr/checkout/conflicts b/swoffsite/.bzr/checkout/conflicts | |||
44 | 3 | deleted file mode 100644 | 1 | deleted file mode 100644 |
45 | index 0dc2d3a..0000000 | |||
46 | --- a/swoffsite/.bzr/checkout/conflicts | |||
47 | +++ /dev/null | |||
48 | @@ -1 +0,0 @@ | |||
49 | 1 | BZR conflict list format 1 | ||
50 | diff --git a/swoffsite/.bzr/checkout/dirstate b/swoffsite/.bzr/checkout/dirstate | |||
51 | 2 | deleted file mode 100644 | 0 | deleted file mode 100644 |
52 | index 51ceaf5..0000000 | |||
53 | 3 | Binary files a/swoffsite/.bzr/checkout/dirstate and /dev/null differ | 1 | Binary files a/swoffsite/.bzr/checkout/dirstate and /dev/null differ |
54 | diff --git a/swoffsite/.bzr/checkout/format b/swoffsite/.bzr/checkout/format | |||
55 | 4 | deleted file mode 100644 | 2 | deleted file mode 100644 |
56 | index e0261c7..0000000 | |||
57 | --- a/swoffsite/.bzr/checkout/format | |||
58 | +++ /dev/null | |||
59 | @@ -1 +0,0 @@ | |||
60 | 1 | Bazaar Working Tree Format 6 (bzr 1.14) | ||
61 | diff --git a/swoffsite/.bzr/checkout/views b/swoffsite/.bzr/checkout/views | |||
62 | 2 | deleted file mode 100644 | 0 | deleted file mode 100644 |
63 | index e69de29..0000000 | |||
64 | --- a/swoffsite/.bzr/checkout/views | |||
65 | +++ /dev/null | |||
66 | diff --git a/swoffsite/.bzr/repository/format b/swoffsite/.bzr/repository/format | |||
67 | 3 | deleted file mode 100644 | 1 | deleted file mode 100644 |
68 | index b200528..0000000 | |||
69 | --- a/swoffsite/.bzr/repository/format | |||
70 | +++ /dev/null | |||
71 | @@ -1 +0,0 @@ | |||
72 | 1 | Bazaar repository format 2a (needs bzr 1.16 or later) | ||
73 | diff --git a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.cix b/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.cix | |||
74 | 2 | deleted file mode 100644 | 0 | deleted file mode 100644 |
75 | index bb19a90..0000000 | |||
76 | 3 | Binary files a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.cix and /dev/null differ | 1 | Binary files a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.cix and /dev/null differ |
77 | diff --git a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.iix b/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.iix | |||
78 | 4 | deleted file mode 100644 | 2 | deleted file mode 100644 |
79 | index 4cfef68..0000000 | |||
80 | 5 | Binary files a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.iix and /dev/null differ | 3 | Binary files a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.iix and /dev/null differ |
81 | diff --git a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.rix b/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.rix | |||
82 | 6 | deleted file mode 100644 | 4 | deleted file mode 100644 |
83 | index 3fb716f..0000000 | |||
84 | 7 | Binary files a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.rix and /dev/null differ | 5 | Binary files a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.rix and /dev/null differ |
85 | diff --git a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.six b/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.six | |||
86 | 8 | deleted file mode 100644 | 6 | deleted file mode 100644 |
87 | index cf4403b..0000000 | |||
88 | 9 | Binary files a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.six and /dev/null differ | 7 | Binary files a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.six and /dev/null differ |
89 | diff --git a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.tix b/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.tix | |||
90 | 10 | deleted file mode 100644 | 8 | deleted file mode 100644 |
91 | index 9e875bb..0000000 | |||
92 | 11 | Binary files a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.tix and /dev/null differ | 9 | Binary files a/swoffsite/.bzr/repository/indices/80cdf3db9d80e5bed1a92485f6128aa2.tix and /dev/null differ |
93 | diff --git a/swoffsite/.bzr/repository/pack-names b/swoffsite/.bzr/repository/pack-names | |||
94 | 12 | deleted file mode 100644 | 10 | deleted file mode 100644 |
95 | index addd39f..0000000 | |||
96 | --- a/swoffsite/.bzr/repository/pack-names | |||
97 | +++ /dev/null | |||
98 | @@ -1,7 +0,0 @@ | |||
99 | 1 | B+Tree Graph Index 2 | ||
100 | 2 | node_ref_lists=0 | ||
101 | 3 | key_elements=1 | ||
102 | 4 | len=1 | ||
103 | 5 | row_lengths=1 | ||
104 | 6 | x��1� PgO�� | ||
105 | 7 | C���������=�W�j��}����t�D8���`��R }D1� p%t���` | ||
106 | 8 | \ No newline at end of file | 0 | \ No newline at end of file |
107 | diff --git a/swoffsite/.bzr/repository/packs/80cdf3db9d80e5bed1a92485f6128aa2.pack b/swoffsite/.bzr/repository/packs/80cdf3db9d80e5bed1a92485f6128aa2.pack | |||
108 | 9 | deleted file mode 100644 | 1 | deleted file mode 100644 |
109 | index 92ef5ea..0000000 | |||
110 | 10 | Binary files a/swoffsite/.bzr/repository/packs/80cdf3db9d80e5bed1a92485f6128aa2.pack and /dev/null differ | 2 | Binary files a/swoffsite/.bzr/repository/packs/80cdf3db9d80e5bed1a92485f6128aa2.pack and /dev/null differ |
111 | diff --git a/swoffsite/swoffsite/cli.py b/swoffsite/swoffsite/cli.py | |||
112 | index aa6381f..a468c6b 100644 | |||
113 | --- a/swoffsite/swoffsite/cli.py | |||
114 | +++ b/swoffsite/swoffsite/cli.py | |||
115 | @@ -26,10 +26,10 @@ import os | |||
116 | 26 | import sys | 26 | import sys |
117 | 27 | import tempfile | 27 | import tempfile |
118 | 28 | 28 | ||
119 | 29 | from .async import FakePool, Pool | ||
120 | 30 | from .cleantemp import cleantemp | 29 | from .cleantemp import cleantemp |
121 | 31 | from .log import configure_logging, log | 30 | from .log import configure_logging, log |
122 | 32 | from .mirror import s3_walk, swift_walk, mirror | 31 | from .mirror import s3_walk, swift_walk, mirror |
123 | 32 | from .pool import FakePool, Pool | ||
124 | 33 | 33 | ||
125 | 34 | 34 | ||
126 | 35 | def s3_bucket_name(): | 35 | def s3_bucket_name(): |
127 | @@ -96,6 +96,9 @@ def parse_args(): | |||
128 | 96 | parser.add_argument( | 96 | parser.add_argument( |
129 | 97 | '--reduced-redundancy', dest='reduced_redundancy', action='store_true', | 97 | '--reduced-redundancy', dest='reduced_redundancy', action='store_true', |
130 | 98 | help='Upload objects with REDUCED_REDUNDANCY class set.') | 98 | help='Upload objects with REDUCED_REDUNDANCY class set.') |
131 | 99 | parser.add_argument( | ||
132 | 100 | '--no-delete', dest='delete', default=True, action='store_false', | ||
133 | 101 | help='Do not delete anything; only upload objects.') | ||
134 | 99 | group = parser.add_mutually_exclusive_group(required=True) | 102 | group = parser.add_mutually_exclusive_group(required=True) |
135 | 100 | group.add_argument( | 103 | group.add_argument( |
136 | 101 | '--to-s3', dest='direction', action='store_const', const='s3', | 104 | '--to-s3', dest='direction', action='store_const', const='s3', |
137 | @@ -143,7 +146,7 @@ def main(): | |||
138 | 143 | mirror(swift_walker, s3_walker, direction=args.direction, | 146 | mirror(swift_walker, s3_walker, direction=args.direction, |
139 | 144 | bucket=args.bucket, gpg_key=args.gpg_key, | 147 | bucket=args.bucket, gpg_key=args.gpg_key, |
140 | 145 | dry_run=args.dry_run, recent=args.recent, pool=pool, | 148 | dry_run=args.dry_run, recent=args.recent, pool=pool, |
142 | 146 | reduced_redundancy=args.reduced_redundancy) | 149 | reduced_redundancy=args.reduced_redundancy, delete=args.delete) |
143 | 147 | finally: | 150 | finally: |
144 | 148 | pool.terminate() | 151 | pool.terminate() |
145 | 149 | 152 | ||
146 | diff --git a/swoffsite/swoffsite/mirror.py b/swoffsite/swoffsite/mirror.py | |||
147 | index cedd1ea..b256991 100644 | |||
148 | --- a/swoffsite/swoffsite/mirror.py | |||
149 | +++ b/swoffsite/swoffsite/mirror.py | |||
150 | @@ -19,7 +19,7 @@ | |||
151 | 19 | __all__ = ['s3_walk', 'swift_walk', 'mirror_swift_to_s3'] | 19 | __all__ = ['s3_walk', 'swift_walk', 'mirror_swift_to_s3'] |
152 | 20 | 20 | ||
153 | 21 | from cStringIO import StringIO | 21 | from cStringIO import StringIO |
155 | 22 | from datetime import datetime | 22 | from datetime import datetime, timedelta, tzinfo |
156 | 23 | import fnmatch | 23 | import fnmatch |
157 | 24 | import multiprocessing | 24 | import multiprocessing |
158 | 25 | import os.path | 25 | import os.path |
159 | @@ -45,6 +45,23 @@ SWIFT_BATCHSIZE = 1000 | |||
160 | 45 | CHUNK_SIZE = 512*1024 | 45 | CHUNK_SIZE = 512*1024 |
161 | 46 | 46 | ||
162 | 47 | 47 | ||
163 | 48 | # In Python 3 we could just use datetime.timezone.utc, but since this is | ||
164 | 49 | # still Python 2 we have to do it ourselves. | ||
165 | 50 | class UTC(tzinfo): | ||
166 | 51 | |||
167 | 52 | def utcoffset(self, dt): | ||
168 | 53 | return timedelta(0) | ||
169 | 54 | |||
170 | 55 | def tzname(self, dt): | ||
171 | 56 | return 'UTC' | ||
172 | 57 | |||
173 | 58 | def dst(self, dt): | ||
174 | 59 | return timedelta(0) | ||
175 | 60 | |||
176 | 61 | |||
177 | 62 | utc = UTC() | ||
178 | 63 | |||
179 | 64 | |||
180 | 48 | def get_s3_name(container, name, md5): | 65 | def get_s3_name(container, name, md5): |
181 | 49 | assert '/' not in container, 'Container name must not contain / char' | 66 | assert '/' not in container, 'Container name must not contain / char' |
182 | 50 | return '{}/{}.{}.gpg'.format(container, name, md5) | 67 | return '{}/{}.{}.gpg'.format(container, name, md5) |
183 | @@ -150,7 +167,7 @@ def get_swift_con(_cons={}): | |||
184 | 150 | key=os.environ.get('OS_PASSWORD'), | 167 | key=os.environ.get('OS_PASSWORD'), |
185 | 151 | retries=5, | 168 | retries=5, |
186 | 152 | snet=False, | 169 | snet=False, |
188 | 153 | auth_version='2.0', | 170 | auth_version=os.environ.get('OS_IDENTITY_API_VERSION', '2.0'), |
189 | 154 | os_options=dict( | 171 | os_options=dict( |
190 | 155 | tenant_id=os.environ.get('OS_TENANT_ID'), | 172 | tenant_id=os.environ.get('OS_TENANT_ID'), |
191 | 156 | tenant_name=os.environ.get('OS_TENANT_NAME'), | 173 | tenant_name=os.environ.get('OS_TENANT_NAME'), |
192 | @@ -424,7 +441,8 @@ def del_swift_task(dry_run, swift_obj): | |||
193 | 424 | 441 | ||
194 | 425 | 442 | ||
195 | 426 | def mirror(swift_walker, s3_walker, direction, bucket, | 443 | def mirror(swift_walker, s3_walker, direction, bucket, |
197 | 427 | gpg_key, dry_run, recent, pool=None, reduced_redundancy=False): | 444 | gpg_key, dry_run, recent, pool=None, reduced_redundancy=False, |
198 | 445 | delete=True): | ||
199 | 428 | next_swift_obj = next(swift_walker, None) # (container, dict) | 446 | next_swift_obj = next(swift_walker, None) # (container, dict) |
200 | 429 | next_s3_key = next(s3_walker, None) # A modified boto.s3.key | 447 | next_s3_key = next(s3_walker, None) # A modified boto.s3.key |
201 | 430 | 448 | ||
202 | @@ -466,9 +484,8 @@ def mirror(swift_walker, s3_walker, direction, bucket, | |||
203 | 466 | # Object found in Swift that isn't in S3. | 484 | # Object found in Swift that isn't in S3. |
204 | 467 | log.debug('{!r} in Swift but not S3'.format(swift_cmp)) | 485 | log.debug('{!r} in Swift but not S3'.format(swift_cmp)) |
205 | 468 | if direction == 's3': | 486 | if direction == 's3': |
209 | 469 | lm = iso8601.parse_date(next_swift_obj[1]['last_modified'], | 487 | lm = iso8601.parse_date(next_swift_obj[1]['last_modified']) |
210 | 470 | None) | 488 | if not recent or datetime.now(utc) > lm + recent: |
208 | 471 | if not recent or datetime.utcnow() > lm + recent: | ||
211 | 472 | num_new_files += 1 | 489 | num_new_files += 1 |
212 | 473 | pool.do(to_s3_task, dry_run, lock, bucket, gpg_key, | 490 | pool.do(to_s3_task, dry_run, lock, bucket, gpg_key, |
213 | 474 | next_swift_obj, | 491 | next_swift_obj, |
214 | @@ -476,8 +493,9 @@ def mirror(swift_walker, s3_walker, direction, bucket, | |||
215 | 476 | else: | 493 | else: |
216 | 477 | num_ignored_files += 1 | 494 | num_ignored_files += 1 |
217 | 478 | elif direction == 'swift': | 495 | elif direction == 'swift': |
220 | 479 | num_dead_files += 1 | 496 | if delete: |
221 | 480 | pool.do(del_swift_task, dry_run, next_swift_obj) | 497 | num_dead_files += 1 |
222 | 498 | pool.do(del_swift_task, dry_run, next_swift_obj) | ||
223 | 481 | else: | 499 | else: |
224 | 482 | raise NotImplementedError(direction) | 500 | raise NotImplementedError(direction) |
225 | 483 | next_swift_obj = next(swift_walker, None) | 501 | next_swift_obj = next(swift_walker, None) |
226 | @@ -486,11 +504,12 @@ def mirror(swift_walker, s3_walker, direction, bucket, | |||
227 | 486 | # Object found in S3 that isn't in Swift. | 504 | # Object found in S3 that isn't in Swift. |
228 | 487 | log.debug('{!r} in S3 but not Swift'.format(s3_cmp)) | 505 | log.debug('{!r} in S3 but not Swift'.format(s3_cmp)) |
229 | 488 | if direction == 's3': | 506 | if direction == 's3': |
235 | 489 | num_dead_files += 1 | 507 | if delete: |
236 | 490 | s3_deletions.append(next_s3_key.name) | 508 | num_dead_files += 1 |
237 | 491 | if len(s3_deletions) > 500: | 509 | s3_deletions.append(next_s3_key.name) |
238 | 492 | pool.do(del_s3_task, dry_run, bucket, s3_deletions) | 510 | if len(s3_deletions) > 500: |
239 | 493 | s3_deletions = [] | 511 | pool.do(del_s3_task, dry_run, bucket, s3_deletions) |
240 | 512 | s3_deletions = [] | ||
241 | 494 | elif direction == 'swift': | 513 | elif direction == 'swift': |
242 | 495 | num_new_files += 1 | 514 | num_new_files += 1 |
243 | 496 | pool.do(to_swift_task, | 515 | pool.do(to_swift_task, |
244 | @@ -506,14 +525,15 @@ def mirror(swift_walker, s3_walker, direction, bucket, | |||
245 | 506 | next_swift_obj = next(swift_walker, None) | 525 | next_swift_obj = next(swift_walker, None) |
246 | 507 | next_s3_key = next(s3_walker, None) | 526 | next_s3_key = next(s3_walker, None) |
247 | 508 | 527 | ||
249 | 509 | if s3_deletions: | 528 | if delete and s3_deletions: |
250 | 510 | # Do any remaining bulk deletions. | 529 | # Do any remaining bulk deletions. |
251 | 511 | pool.do(del_s3_task, dry_run, bucket, s3_deletions) | 530 | pool.do(del_s3_task, dry_run, bucket, s3_deletions) |
252 | 512 | 531 | ||
253 | 513 | cdir = direction.capitalize() | 532 | cdir = direction.capitalize() |
254 | 514 | log.info('{} files in sync'.format(num_unchanged_files)) | 533 | log.info('{} files in sync'.format(num_unchanged_files)) |
255 | 515 | log.info('{} files to send to {}'.format(num_new_files, cdir)) | 534 | log.info('{} files to send to {}'.format(num_new_files, cdir)) |
257 | 516 | log.info('{} files to remove from {}'.format(num_dead_files, cdir)) | 535 | if delete: |
258 | 536 | log.info('{} files to remove from {}'.format(num_dead_files, cdir)) | ||
259 | 517 | if recent and direction == 's3': | 537 | if recent and direction == 's3': |
260 | 518 | log.info('{} files ignored (younger than {})'.format(num_ignored_files, | 538 | log.info('{} files ignored (younger than {})'.format(num_ignored_files, |
261 | 519 | recent)) | 539 | recent)) |
262 | diff --git a/swoffsite/swoffsite/async.py b/swoffsite/swoffsite/pool.py | |||
263 | 520 | similarity index 100% | 540 | similarity index 100% |
264 | 521 | rename from swoffsite/swoffsite/async.py | 541 | rename from swoffsite/swoffsite/async.py |
265 | 522 | rename to swoffsite/swoffsite/pool.py | 542 | rename to swoffsite/swoffsite/pool.py |
LGTM