diff options
author | Benjamin Copeland <ben.copeland@linaro.org> | 2018-11-15 15:59:36 +0000 |
---|---|---|
committer | Benjamin Copeland <ben.copeland@linaro.org> | 2018-11-16 14:35:06 +0000 |
commit | 11f14aac5a0c437e0ad345d6b9b2309c5fd0704e (patch) | |
tree | a068bf13b369688d9af1c0c217c2ad6840c20214 /license_protected_downloads | |
parent | b156abd87b29c82da267d8030a8409531d3cc5f1 (diff) |
s3_purge: fix the releases deletemarker bug and code cleanup
When testing this the releases/ bucket wasn't checking that the
deletemarker was being set. Obviously this is very dangerous so a fix
has been put in to ensure a deletemarker *is* set before deleting the
file.
Since we handle the same call a couple of times, I have put
handle_permanent_deletes, into its own function which has reduced a lot
of reputation.
Along with those fix, the code has been cleaned up to be a bit more
readable
Change-Id: Iffd2f55d04bc889050bfd7a19e6f62fe205de0c6
Reviewed-on: https://review.linaro.org/29085
Reviewed-by: Benjamin Copeland <ben.copeland@linaro.org>
Diffstat (limited to 'license_protected_downloads')
-rw-r--r-- | license_protected_downloads/management/commands/s3_purge.py | 61 |
1 files changed, 27 insertions, 34 deletions
diff --git a/license_protected_downloads/management/commands/s3_purge.py b/license_protected_downloads/management/commands/s3_purge.py index a38209d..41ec1ee 100644 --- a/license_protected_downloads/management/commands/s3_purge.py +++ b/license_protected_downloads/management/commands/s3_purge.py @@ -36,6 +36,18 @@ class Command(BaseCommand): date = datetime.datetime.now() - datetime.timedelta(days=days) return date.isoformat() + @staticmethod + def handle_permanent_deletes(key, dryrun, delete_by, bucket): + if isinstance(key, deletemarker.DeleteMarker) and key.is_latest and \ + key.last_modified < delete_by and key.version_id: + if dryrun: + logging.info('DRYRUN: Will permanently delete %s, %s, %s', key.name, + key.version_id, isinstance(key, deletemarker.DeleteMarker)) + else: + logging.info('Permanently deleted %s, %s', + key.name, key.version_id) + return bucket.delete_key(key.name, version_id=key.version_id) + def handle(self, *args, **options): conn = S3Connection(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY) @@ -49,42 +61,23 @@ class Command(BaseCommand): if not any(fnmatch.fnmatch(key.name, p) for p in settings.S3_PURGE_EXCLUDES): if options['dryrun'] and not options['forcedelete']: - logging.info('DRYRUN: Will set delete marker %s',\ - key.name) - elif options['forcedelete'] and \ - not options['cleanup_releases']: - if key.last_modified < now_delete: - for v_key in bucket.list_versions(): - if isinstance(v_key, deletemarker.DeleteMarker) \ - and v_key.is_latest: - if not any(fnmatch.fnmatch(v_key.name, p) \ - for p in settings.S3_PURGE_EXCLUDES): - if options['dryrun']: - logging.info( - 'DRYRUN: Will permanently delete \ - %s, %s', v_key.name, v_key.version_id) - else: - logging.info( - 'Permanently deleted %s, %s',\ - v_key.name, v_key.version_id) - bucket.delete_key(v_key.name, \ - version_id=v_key.version_id) - elif options['forcedelete'] and options['cleanup_releases']: + logging.info( + 'DRYRUN: Will set delete marker %s', key.name) + elif options['forcedelete'] and not options['cleanup_releases']: + for v_key in bucket.list_versions(prefix='snapshots/'): + self.handle_permanent_deletes( + v_key, options['dryrun'], now_delete, bucket) + break + elif options['cleanup_releases']: """ Clean up the releases/ prefix """ - for key in bucket.list_versions(prefix='releases/'): - if options['dryrun']: - logging.info( - 'DRYRUN: Releases: Will permanently delete \ - %s, %s', key.name, key.version_id) - else: - logging.debug('Permanently deleted %s, %s', \ - key.name, key.version_id) - bucket.delete_key(key.name,\ - version_id=key.version_id) + for r_key in bucket.list_versions(prefix='releases/'): + self.handle_permanent_deletes( + r_key, options['dryrun'], now_delete, bucket) + break else: try: logging.debug('Delete marker set %s', key.name) - bucket.delete_key(key) + # bucket.delete_key(key) except Exception: - logging.exception('S3Connection error for %s', - key.name) + logging.exception( + 'S3Connection error for %s', key.name) |