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 : [email protected]
Unsubscribe : http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack