def initialize_slo(request, container, prefix=None): '''Initiate a slo upload. Create a segments container. Return the segment number the upload should start at. Return the size of the segments. Return swift_url ''' # Check POST if not (request.POST): return HttpResponse("No POST in request.", status=500) # Check form is valid. form = StartSloForm(request.POST) if not form.is_valid(): return HttpResponse("Invalid Form.", status=500) # Create container for the segments if not create_segments_container(request, container): return HttpResponse("Unable to create container", status=500) file_name = form.cleaned_data["file_name"] file_size = float(form.cleaned_data["file_size"]) try: segment_number = get_segment_number(file_name, request, container + "_segments", prefix) except client.ClientException, e: return HttpResponse(e, status=500)
def create_manifest(request, container, prefix=None): '''Given a file name, upload a manifest file assuming the segments are held in a "<file_name>_segments" pseudo folder. Return an error if the upload of the manifest fails. Return an HTTP request with status 201 if no issues. ''' if (request.POST): form = StartSloForm(request.POST) if form.is_valid(): # Get objects in the segment folder file_name = form.cleaned_data["file_name"] if prefix: foldername = prefix + '/' + file_name + '_segments' else: foldername = file_name + '_segments' storage_url = request.session.get('storage_url', '') auth_token = request.session.get('auth_token', '') foldername = os.path.normpath(foldername) foldername = foldername.strip('/') foldername += '/' meta, objects = client.get_container( storage_url, auth_token, container + "_segments", delimiter='/', prefix=foldername) pseudofolders, objs = pseudofolder_object_list(objects, prefix) # Create manifest = [] # Create a manifest entry for each segment for segment in objs: manifest.append({ "path": "/" + container + "_segments/" + segment["name"], "etag": segment["hash"].encode('ascii', 'ignore'), "size_bytes": str(segment["bytes"]), }) manifest = sorted(manifest, key=lambda k: k['path']) with NamedTemporaryFile() as f: json.dump(manifest, f) f.seek(0) try: #TODO: add prefix to file_name client.put_object( storage_url, auth_token, container.encode('ascii', 'ignore'), file_name, f, query_string="multipart-manifest=put") except Exception, e: return HttpResponse("Failed to upload manifest.", status=500) return HttpResponse("Successfully uploaded " + file_name, status=201)