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 | deleted file mode 100644 |
3 | index f82dc1c..0000000 |
4 | --- a/swoffsite/.bzr/README |
5 | +++ /dev/null |
6 | @@ -1,3 +0,0 @@ |
7 | -This is a Bazaar control directory. |
8 | -Do not change any files in this directory. |
9 | -See http://bazaar.canonical.com/ for more information about Bazaar. |
10 | diff --git a/swoffsite/.bzr/branch-format b/swoffsite/.bzr/branch-format |
11 | deleted file mode 100644 |
12 | index 9eb09b7..0000000 |
13 | --- a/swoffsite/.bzr/branch-format |
14 | +++ /dev/null |
15 | @@ -1 +0,0 @@ |
16 | -Bazaar-NG meta directory, format 1 |
17 | diff --git a/swoffsite/.bzr/branch/branch.conf b/swoffsite/.bzr/branch/branch.conf |
18 | deleted file mode 100644 |
19 | index aace28c..0000000 |
20 | --- a/swoffsite/.bzr/branch/branch.conf |
21 | +++ /dev/null |
22 | @@ -1 +0,0 @@ |
23 | -parent_location = bzr+ssh://bazaar.launchpad.net/+branch/swoffsite/ |
24 | diff --git a/swoffsite/.bzr/branch/format b/swoffsite/.bzr/branch/format |
25 | deleted file mode 100644 |
26 | index dc392f4..0000000 |
27 | --- a/swoffsite/.bzr/branch/format |
28 | +++ /dev/null |
29 | @@ -1 +0,0 @@ |
30 | -Bazaar Branch Format 7 (needs bzr 1.6) |
31 | diff --git a/swoffsite/.bzr/branch/last-revision b/swoffsite/.bzr/branch/last-revision |
32 | deleted file mode 100644 |
33 | index ee0a4d1..0000000 |
34 | --- a/swoffsite/.bzr/branch/last-revision |
35 | +++ /dev/null |
36 | @@ -1 +0,0 @@ |
37 | -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 | 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 | deleted file mode 100644 |
45 | index 0dc2d3a..0000000 |
46 | --- a/swoffsite/.bzr/checkout/conflicts |
47 | +++ /dev/null |
48 | @@ -1 +0,0 @@ |
49 | -BZR conflict list format 1 |
50 | diff --git a/swoffsite/.bzr/checkout/dirstate b/swoffsite/.bzr/checkout/dirstate |
51 | deleted file mode 100644 |
52 | index 51ceaf5..0000000 |
53 | 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 | deleted file mode 100644 |
56 | index e0261c7..0000000 |
57 | --- a/swoffsite/.bzr/checkout/format |
58 | +++ /dev/null |
59 | @@ -1 +0,0 @@ |
60 | -Bazaar Working Tree Format 6 (bzr 1.14) |
61 | diff --git a/swoffsite/.bzr/checkout/views b/swoffsite/.bzr/checkout/views |
62 | 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 | deleted file mode 100644 |
68 | index b200528..0000000 |
69 | --- a/swoffsite/.bzr/repository/format |
70 | +++ /dev/null |
71 | @@ -1 +0,0 @@ |
72 | -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 | deleted file mode 100644 |
75 | index bb19a90..0000000 |
76 | 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 | deleted file mode 100644 |
79 | index 4cfef68..0000000 |
80 | 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 | deleted file mode 100644 |
83 | index 3fb716f..0000000 |
84 | 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 | deleted file mode 100644 |
87 | index cf4403b..0000000 |
88 | 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 | deleted file mode 100644 |
91 | index 9e875bb..0000000 |
92 | 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 | deleted file mode 100644 |
95 | index addd39f..0000000 |
96 | --- a/swoffsite/.bzr/repository/pack-names |
97 | +++ /dev/null |
98 | @@ -1,7 +0,0 @@ |
99 | -B+Tree Graph Index 2 |
100 | -node_ref_lists=0 |
101 | -key_elements=1 |
102 | -len=1 |
103 | -row_lengths=1 |
104 | -x��1� PgO�� |
105 | -C���������=�W�j��}����t�D8���`��R }D1� p%t���` |
106 | \ No newline at end of file |
107 | diff --git a/swoffsite/.bzr/repository/packs/80cdf3db9d80e5bed1a92485f6128aa2.pack b/swoffsite/.bzr/repository/packs/80cdf3db9d80e5bed1a92485f6128aa2.pack |
108 | deleted file mode 100644 |
109 | index 92ef5ea..0000000 |
110 | 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 | import sys |
117 | import tempfile |
118 | |
119 | -from .async import FakePool, Pool |
120 | from .cleantemp import cleantemp |
121 | from .log import configure_logging, log |
122 | from .mirror import s3_walk, swift_walk, mirror |
123 | +from .pool import FakePool, Pool |
124 | |
125 | |
126 | def s3_bucket_name(): |
127 | @@ -96,6 +96,9 @@ def parse_args(): |
128 | parser.add_argument( |
129 | '--reduced-redundancy', dest='reduced_redundancy', action='store_true', |
130 | help='Upload objects with REDUCED_REDUNDANCY class set.') |
131 | + parser.add_argument( |
132 | + '--no-delete', dest='delete', default=True, action='store_false', |
133 | + help='Do not delete anything; only upload objects.') |
134 | group = parser.add_mutually_exclusive_group(required=True) |
135 | group.add_argument( |
136 | '--to-s3', dest='direction', action='store_const', const='s3', |
137 | @@ -143,7 +146,7 @@ def main(): |
138 | mirror(swift_walker, s3_walker, direction=args.direction, |
139 | bucket=args.bucket, gpg_key=args.gpg_key, |
140 | dry_run=args.dry_run, recent=args.recent, pool=pool, |
141 | - reduced_redundancy=args.reduced_redundancy) |
142 | + reduced_redundancy=args.reduced_redundancy, delete=args.delete) |
143 | finally: |
144 | pool.terminate() |
145 | |
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 | __all__ = ['s3_walk', 'swift_walk', 'mirror_swift_to_s3'] |
152 | |
153 | from cStringIO import StringIO |
154 | -from datetime import datetime |
155 | +from datetime import datetime, timedelta, tzinfo |
156 | import fnmatch |
157 | import multiprocessing |
158 | import os.path |
159 | @@ -45,6 +45,23 @@ SWIFT_BATCHSIZE = 1000 |
160 | CHUNK_SIZE = 512*1024 |
161 | |
162 | |
163 | +# In Python 3 we could just use datetime.timezone.utc, but since this is |
164 | +# still Python 2 we have to do it ourselves. |
165 | +class UTC(tzinfo): |
166 | + |
167 | + def utcoffset(self, dt): |
168 | + return timedelta(0) |
169 | + |
170 | + def tzname(self, dt): |
171 | + return 'UTC' |
172 | + |
173 | + def dst(self, dt): |
174 | + return timedelta(0) |
175 | + |
176 | + |
177 | +utc = UTC() |
178 | + |
179 | + |
180 | def get_s3_name(container, name, md5): |
181 | assert '/' not in container, 'Container name must not contain / char' |
182 | return '{}/{}.{}.gpg'.format(container, name, md5) |
183 | @@ -150,7 +167,7 @@ def get_swift_con(_cons={}): |
184 | key=os.environ.get('OS_PASSWORD'), |
185 | retries=5, |
186 | snet=False, |
187 | - auth_version='2.0', |
188 | + auth_version=os.environ.get('OS_IDENTITY_API_VERSION', '2.0'), |
189 | os_options=dict( |
190 | tenant_id=os.environ.get('OS_TENANT_ID'), |
191 | tenant_name=os.environ.get('OS_TENANT_NAME'), |
192 | @@ -424,7 +441,8 @@ def del_swift_task(dry_run, swift_obj): |
193 | |
194 | |
195 | def mirror(swift_walker, s3_walker, direction, bucket, |
196 | - gpg_key, dry_run, recent, pool=None, reduced_redundancy=False): |
197 | + gpg_key, dry_run, recent, pool=None, reduced_redundancy=False, |
198 | + delete=True): |
199 | next_swift_obj = next(swift_walker, None) # (container, dict) |
200 | next_s3_key = next(s3_walker, None) # A modified boto.s3.key |
201 | |
202 | @@ -466,9 +484,8 @@ def mirror(swift_walker, s3_walker, direction, bucket, |
203 | # Object found in Swift that isn't in S3. |
204 | log.debug('{!r} in Swift but not S3'.format(swift_cmp)) |
205 | if direction == 's3': |
206 | - lm = iso8601.parse_date(next_swift_obj[1]['last_modified'], |
207 | - None) |
208 | - if not recent or datetime.utcnow() > lm + recent: |
209 | + lm = iso8601.parse_date(next_swift_obj[1]['last_modified']) |
210 | + if not recent or datetime.now(utc) > lm + recent: |
211 | num_new_files += 1 |
212 | pool.do(to_s3_task, dry_run, lock, bucket, gpg_key, |
213 | next_swift_obj, |
214 | @@ -476,8 +493,9 @@ def mirror(swift_walker, s3_walker, direction, bucket, |
215 | else: |
216 | num_ignored_files += 1 |
217 | elif direction == 'swift': |
218 | - num_dead_files += 1 |
219 | - pool.do(del_swift_task, dry_run, next_swift_obj) |
220 | + if delete: |
221 | + num_dead_files += 1 |
222 | + pool.do(del_swift_task, dry_run, next_swift_obj) |
223 | else: |
224 | raise NotImplementedError(direction) |
225 | next_swift_obj = next(swift_walker, None) |
226 | @@ -486,11 +504,12 @@ def mirror(swift_walker, s3_walker, direction, bucket, |
227 | # Object found in S3 that isn't in Swift. |
228 | log.debug('{!r} in S3 but not Swift'.format(s3_cmp)) |
229 | if direction == 's3': |
230 | - num_dead_files += 1 |
231 | - s3_deletions.append(next_s3_key.name) |
232 | - if len(s3_deletions) > 500: |
233 | - pool.do(del_s3_task, dry_run, bucket, s3_deletions) |
234 | - s3_deletions = [] |
235 | + if delete: |
236 | + num_dead_files += 1 |
237 | + s3_deletions.append(next_s3_key.name) |
238 | + if len(s3_deletions) > 500: |
239 | + pool.do(del_s3_task, dry_run, bucket, s3_deletions) |
240 | + s3_deletions = [] |
241 | elif direction == 'swift': |
242 | num_new_files += 1 |
243 | pool.do(to_swift_task, |
244 | @@ -506,14 +525,15 @@ def mirror(swift_walker, s3_walker, direction, bucket, |
245 | next_swift_obj = next(swift_walker, None) |
246 | next_s3_key = next(s3_walker, None) |
247 | |
248 | - if s3_deletions: |
249 | + if delete and s3_deletions: |
250 | # Do any remaining bulk deletions. |
251 | pool.do(del_s3_task, dry_run, bucket, s3_deletions) |
252 | |
253 | cdir = direction.capitalize() |
254 | log.info('{} files in sync'.format(num_unchanged_files)) |
255 | log.info('{} files to send to {}'.format(num_new_files, cdir)) |
256 | - log.info('{} files to remove from {}'.format(num_dead_files, cdir)) |
257 | + if delete: |
258 | + log.info('{} files to remove from {}'.format(num_dead_files, cdir)) |
259 | if recent and direction == 's3': |
260 | log.info('{} files ignored (younger than {})'.format(num_ignored_files, |
261 | recent)) |
262 | diff --git a/swoffsite/swoffsite/async.py b/swoffsite/swoffsite/pool.py |
263 | similarity index 100% |
264 | rename from swoffsite/swoffsite/async.py |
265 | rename to swoffsite/swoffsite/pool.py |
LGTM