Example #1
0
def get_container(api_ver, account, container):
    _validate_container(api_ver, account, container)

    prefix = bottle.request.params.get('prefix', '')
    delimiter = bottle.request.params.get('delimiter')
    limit = bottle.request.params.get('limit', '')
    marker = bottle.request.params.get('marker', '')
    end_marker = bottle.request.params.get('end_marker', '')
    path = bottle.request.params.get('path', '')

    if delimiter and (len(delimiter) > 1 or ord(delimiter) > 254):
        raise bottle.HTTPError(412, 'Bad delimiter')

    try:
        limit = int(limit)
    except ValueError:
        limit = CONTAINER_LISTING_LIMIT

    if limit > CONTAINER_LISTING_LIMIT:
        raise bottle.HTTPError(412,
                               'Maximum limit is %d' % CONTAINER_LISTING_LIMIT)

    if path:
        delimiter = '/'
        if path.endswith('/'):
            path = path[:-1]
        prefix = path

    container_data = get_container_data(
        user_name=account,
        vol_name=container,
        prefix=prefix,
        delimiter=delimiter,
        limit=limit,
        start_marker=marker,
        end_marker=end_marker)

    for key, value in container_data['meta'].iteritems():
        bottle.response.set_header(str(key), str(value))

    format_param = get_format_from_request()
    logger.debug('Accepted format: %s', format_param)

    serializer = get_serializer(format_param)
    bottle.response.content_type = serializer.content_type
    if not container_data['content']:
        bottle.response.status = 204

    return serializer.serialize(container_data)
Example #2
0
def get_container(api_ver, account, container):
    _validate_container(api_ver, account, container)

    prefix = bottle.request.params.get('prefix', '')
    delimiter = bottle.request.params.get('delimiter')
    limit = bottle.request.params.get('limit', '')
    marker = bottle.request.params.get('marker', '')
    end_marker = bottle.request.params.get('end_marker', '')
    path = bottle.request.params.get('path', '')

    if delimiter and (len(delimiter) > 1 or ord(delimiter) > 254):
        raise bottle.HTTPError(412, 'Bad delimiter')

    try:
        limit = int(limit)
    except ValueError:
        limit = CONTAINER_LISTING_LIMIT

    if limit > CONTAINER_LISTING_LIMIT:
        raise bottle.HTTPError(412,
                               'Maximum limit is %d' % CONTAINER_LISTING_LIMIT)

    if path:
        delimiter = '/'
        if path.endswith('/'):
            path = path[:-1]
        prefix = path

    container_data = get_container_data(user_name=account,
                                        vol_name=container,
                                        prefix=prefix,
                                        delimiter=delimiter,
                                        limit=limit,
                                        start_marker=marker,
                                        end_marker=end_marker)

    for key, value in container_data['meta'].iteritems():
        bottle.response.set_header(str(key), str(value))

    format_param = get_format_from_request()
    logger.debug('Accepted format: %s', format_param)

    serializer = get_serializer(format_param)
    bottle.response.content_type = serializer.content_type
    if not container_data['content']:
        bottle.response.status = 204

    return serializer.serialize(container_data)
Example #3
0
def put_container(api_ver, account, container):
    _validate_container(api_ver, account, container)
    settings = get_settings()
    size = bottle.request.get_header('x-container-meta-quota-bytes', '')
    try:
        size = int(size)
    except ValueError:
        size = settings['default.volume.size']

    info = {'created_by': 'sxswift', 'created_at': time.time()}
    info = json.dumps(info).encode('hex')

    create_user_if_not_exists(account)

    created = create_volume_if_not_exists(
        vol_name=container, user_name=account, size=size,
        replica_count=settings['default.volume.replica_count'],
        max_revisions=settings['default.volume.max_revisions'],
        meta={'creation_info': info}
    )
    bottle.response.status = 201 if created else 202
    post_container(api_ver, account, container)
Example #4
0
def post_container(api_ver, account, container):
    _validate_container(api_ver, account, container)
    remove_meta, update_meta = get_meta_to_remove_and_update(
        'x-container-meta-', 'x-remove-container-meta-')

    # TODO: add max volume size change

    # TODO: handle custom headers:
    # X-Container-Read, X-Container-Write, X-Versions-Location,
    # X-Remove-Versions-Location, X-Container-Meta-Web-Directory-Type

    size = bottle.request.get_header('x-container-meta-quota-bytes', '')
    try:
        size = int(size)
    except ValueError:
        size = None

    update_container_meta(user_name=account,
                          vol_name=container,
                          remove_list=remove_meta,
                          update_dict=update_meta,
                          new_size=size)
    bottle.response.status = 204
Example #5
0
def put_container(api_ver, account, container):
    _validate_container(api_ver, account, container)
    settings = get_settings()
    size = bottle.request.get_header('x-container-meta-quota-bytes', '')
    try:
        size = int(size)
    except ValueError:
        size = settings['default.volume.size']

    info = {'created_by': 'sxswift', 'created_at': time.time()}
    info = json.dumps(info).encode('hex')

    create_user_if_not_exists(account)

    created = create_volume_if_not_exists(
        vol_name=container,
        user_name=account,
        size=size,
        replica_count=settings['default.volume.replica_count'],
        max_revisions=settings['default.volume.max_revisions'],
        meta={'creation_info': info})
    bottle.response.status = 201 if created else 202
    post_container(api_ver, account, container)
Example #6
0
def post_container(api_ver, account, container):
    _validate_container(api_ver, account, container)
    remove_meta, update_meta = get_meta_to_remove_and_update(
        'x-container-meta-', 'x-remove-container-meta-'
    )

    # TODO: add max volume size change

    # TODO: handle custom headers:
    # X-Container-Read, X-Container-Write, X-Versions-Location,
    # X-Remove-Versions-Location, X-Container-Meta-Web-Directory-Type

    size = bottle.request.get_header('x-container-meta-quota-bytes', '')
    try:
        size = int(size)
    except ValueError:
        size = None

    update_container_meta(
        user_name=account, vol_name=container, remove_list=remove_meta,
        update_dict=update_meta, new_size=size
    )
    bottle.response.status = 204
Example #7
0
def delete_container(api_ver, account, container):
    _validate_container(api_ver, account, container)
    delete_volume(container)
    bottle.response.status = 204
Example #8
0
def _validate_object(api_ver, account, container, object):
    _validate_container(api_ver, account, container)

    if not object_name_is_valid(object):
        msg = 'Object name %s is invalid' % object
        raise bottle.HTTPError(400, msg)