aboutsummaryrefslogtreecommitdiff
path: root/license_protected_downloads
diff options
context:
space:
mode:
authorBenjamin Copeland <ben.copeland@linaro.org>2018-11-15 15:59:36 +0000
committerBenjamin Copeland <ben.copeland@linaro.org>2018-11-16 14:35:06 +0000
commit11f14aac5a0c437e0ad345d6b9b2309c5fd0704e (patch)
treea068bf13b369688d9af1c0c217c2ad6840c20214 /license_protected_downloads
parentb156abd87b29c82da267d8030a8409531d3cc5f1 (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.py61
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)