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

Reply via email to