Skip to content

Commit 68af3c1

Browse files
author
Piotr Kaleta
committed
Multipart upload added.
1 parent 7ba14fa commit 68af3c1

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ Commands
212212
* <code>glacier vault sync [--wait] [--fix] [--max-age <em>hours</em>] <em>vault-name</em></code>
213213
* <code>glacier archive list <em>vault-name</em></code>
214214
* <code>glacier archive upload [--name <em>archive-name</em>] <em>vault-name</em> <em>filename</em></code>
215+
* <code>glacier archive multipart_upload [--name <em>archive-name</em>] [--part-size <em>part-size</em>] <em>vault-name</em> <em>filename</em></code>
215216
* <code>glacier archive retrieve [--wait] [-o <em>filename</em>] [--multipart-size <em>bytes</em>] <em>vault-name</em> <em>archive-name</em></code>
216217
* <code>glacier archive retrieve [--wait] [--multipart-size <em>bytes</em>] <em>vault-name</em> <em>archive-name</em> [<em>archive-name</em>...]</code>
217218
* <code>glacier archive delete <em>vault-name</em> <em>archive-name</em></code>

glacier.py

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@
4949
INVENTORY_LAG = 24 * 60 * 60 * 3
5050

5151
PROGRAM_NAME = 'glacier'
52+
DEFAULT_PART_SIZE = 4194304
53+
5254

5355
class ConsoleError(RuntimeError):
5456
def __init__(self, m):
@@ -463,7 +465,7 @@ def archive_list(self, args):
463465
if archive_list:
464466
print(*archive_list, sep="\n")
465467

466-
def archive_upload(self, args):
468+
def archive_upload(self, args, multipart=False):
467469
# XXX: "Leading whitespace in archive descriptions is removed."
468470
# XXX: "The description must be less than or equal to 1024 bytes. The
469471
# allowable characters are 7 bit ASCII without control codes,
@@ -473,15 +475,25 @@ def archive_upload(self, args):
473475
name = args.name
474476
else:
475477
try:
476-
full_name = args.file.name
478+
full_name = args.file
477479
except:
478-
raise RuntimeError('Archive name not specified. Use --name')
480+
raise RuntimeError("Archive name not specified. Use --name.")
479481
name = os.path.basename(full_name)
480482

481483
vault = self.connection.get_vault(args.vault)
482-
archive_id = vault.create_archive_from_file(file_obj=args.file, description=name)
484+
485+
if not multipart:
486+
archive_id = vault.create_archive_from_file(
487+
filename=args.file, description=name)
488+
else:
489+
archive_id = vault.concurrent_create_archive_from_file(
490+
filename=args.file, description=name)
491+
483492
self.cache.add_archive(args.vault, name, archive_id)
484493

494+
def multipart_archive_upload(self, args):
495+
return self.archive_upload(args, multipart=True)
496+
485497
@staticmethod
486498
def _write_archive_retrieval_job(f, job, multipart_size):
487499
if job.archive_size > multipart_size:
@@ -639,12 +651,28 @@ def main(self):
639651
archive_list_subparser = archive_subparser.add_parser('list')
640652
archive_list_subparser.set_defaults(func=self.archive_list)
641653
archive_list_subparser.add_argument('vault')
654+
655+
# Upload command
642656
archive_upload_subparser = archive_subparser.add_parser('upload')
643657
archive_upload_subparser.set_defaults(func=self.archive_upload)
644658
archive_upload_subparser.add_argument('vault')
645-
archive_upload_subparser.add_argument('file',
646-
type=argparse.FileType('rb'))
659+
archive_upload_subparser.add_argument('file')
647660
archive_upload_subparser.add_argument('--name')
661+
662+
# Multipart upload command
663+
archive_multipart_upload_subparser = archive_subparser.add_parser(
664+
'multipart_upload')
665+
archive_multipart_upload_subparser.set_defaults(
666+
func=self.multipart_archive_upload)
667+
archive_multipart_upload_subparser.add_argument('vault')
668+
archive_multipart_upload_subparser.add_argument('file')
669+
archive_multipart_upload_subparser.add_argument('--name')
670+
archive_multipart_upload_subparser.add_argument(
671+
'--part-size',
672+
default=DEFAULT_PART_SIZE,
673+
dest="part_size"
674+
)
675+
648676
archive_retrieve_subparser = archive_subparser.add_parser('retrieve')
649677
archive_retrieve_subparser.set_defaults(func=self.archive_retrieve)
650678
archive_retrieve_subparser.add_argument('vault')

0 commit comments

Comments
 (0)