On 25/07/15 00:28, Vincenzo Pii wrote: > To upload a Dynamic Large Object with the Swift CLI one can just do > > swift upload newcont -S 1048576000 large_object > > but, is there any equivalent in the swift python APIs (swiftclient module > from https://github.com/openstack/python-swiftclient)? > > The content_length parameter of put_object will just truncate the content... >
The general approach is outlined here (Swift API section): https://www.mirantis.com/blog/large-objects-in-cloud-storages/ I have attached a rather simple sample program that uses the idea. regards Mark
#!/usr/bin/python import swiftclient import os import argparse parser = argparse.ArgumentParser() parser.add_argument("-c", "--container", help="container", default="con") parser.add_argument("-o", "--obj", help="object", default="file") parser.add_argument("-s", "--segsize", help="segment size", type=int, default=104857600) parser.add_argument("-u", "--user", help="user", default="demo:demo") parser.add_argument("-k", "--key", help="key", default="password") parser.add_argument("-r", "--region", help="region", default="RegionOne") parser.add_argument("-a", "--authurl", help="auth url", default="http://192.168.122.31:35357/v2.0") args = parser.parse_args() options = {'tenant_name': args.user.split(':')[0], 'region_name': args.region} conn = swiftclient.Connection( user = args.user, key = args.key, authurl = args.authurl, insecure = True, auth_version = 2, os_options = options, ) # figure out how many segments to use obj_name = args.obj obj_size = os.path.getsize(obj_name) seg_size = args.segsize segs = (obj_size / seg_size) + 1 # create the container, and the segment container con_name = args.container seg_con_name = con_name + '_segments' print "container {0}".format(con_name) conn.put_container(con_name) print "container {0}".format(seg_con_name) conn.put_container(seg_con_name) # start upload of each segment print "begin segment upload of " + obj_name print "size " + str(obj_size) + ", " + str(segs) + " segs" fp = open(obj_name, 'r') for n in range(1, segs + 1): seg_name = '%s/%08d' % (obj_name, n) if (obj_size - (n - 1) * seg_size < seg_size): size = obj_size - (n - 1) * seg_size else: size = seg_size fp.seek((n - 1) * seg_size) print " upload segment " + str(n) + " size " + str(size) conn.put_object(seg_con_name, seg_name, fp, content_length=size, ) print "end segment upload" print "create manifest" obj_manifest_header = {} obj_manifest_header['x-object-manifest'] = '%s/%s/' % (seg_con_name, obj_name) conn.put_object(con_name, obj_name, None, content_length=obj_size, headers=obj_manifest_header, ) print "done" fp.close()
_______________________________________________ Mailing list: http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack Post to : openstack@lists.openstack.org Unsubscribe : http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack