Exemple #1
0
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)
Exemple #2
0
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)