Esempio n. 1
0
    def on_head(self, req, resp, vault_id, storage_block_id):
        """Returns the block data from storage alone"""
        storage = BlockStorage.get(vault_id)

        if storage is None:
            logger.error('Vault [{0}] does not exist'.format(vault_id))
            raise errors.HTTPNotFound

        storage_block_info = storage.head_block(storage_block_id)

        if storage_block_info is None:
            logger.error('Block [{0}] does not exist in storage'.format(
                storage_block_id))
            raise errors.HTTPNotFound

        resp.set_header('X-Block-Reference-Count',
                        str(storage_block_info['reference']['count']))
        resp.set_header('X-Ref-Modified',
                        str(storage_block_info['reference']['modified']))
        resp.set_header('X-Storage-ID',
                        str(storage_block_info['id']['storage']))
        resp.set_header('X-Block-ID',
                        str(storage_block_info['id']['metadata']))
        resp.set_header('X-Block-Size', str(storage_block_info['length']))
        resp.set_header('X-Block-Orphaned',
                        str(storage_block_info['orphaned']))

        resp.status = falcon.HTTP_204
Esempio n. 2
0
    def on_get(self, req, resp, vault_id):
        """List the blocks in the vault from storage-alone
        """
        vault = Vault.get(vault_id)
        if vault is None:
            logger.error('Vault [{0}] does not exist'.format(vault_id))
            raise errors.HTTPNotFound

        inmarker = req.get_param('marker') if req.get_param('marker') else None
        limit = req.get_param_as_int('limit') if req.get_param_as_int('limit') else \
            conf.api_configuration.default_returned_num

        # We actually fetch the user's requested
        # limit +1 to detect if the list is being
        # truncated or not.
        storage = BlockStorage.get(vault_id)
        storage_blocks = storage.get_blocks_generator(inmarker, limit + 1)

        responses = list(storage_blocks)

        # Was the list truncated? See note above about +1
        truncated = len(responses) > 0 and len(responses) == limit + 1

        outmarker = responses.pop().storage_block_id if truncated else None

        if outmarker:
            query_args = {'marker': outmarker}
            query_args['limit'] = limit
            returl = set_qs_on_url(req.url, query_args)
            resp.set_header("X-Next-Batch", returl)

        resp.body = json.dumps(
            [response.storage_block_id for response in responses])
Esempio n. 3
0
    def on_get(self, req, resp, vault_id, storage_block_id):
        """Returns a specific block from storage alone"""
        storage = BlockStorage.get(vault_id)

        if storage is None:
            logger.error('Vault [{0}] does not exist'.format(vault_id))
            raise errors.HTTPNotFound

        block = storage.get_block(storage_block_id)

        if block is None:
            logger.error('block [{0}] does not exist'.format(storage_block_id))
            raise errors.HTTPNotFound

        ref_cnt = block.get_ref_count() if block.metadata_block_id else 0
        ref_mod = block.get_ref_modified() if block.metadata_block_id else 0

        resp.set_header('X-Block-Reference-Count', str(ref_cnt))
        resp.set_header('X-Ref-Modified', str(ref_mod))

        resp.set_header('X-Storage-ID', str(storage_block_id))
        resp.set_header('X-Block-ID', str(block.metadata_block_id))

        resp.stream = block.get_obj()
        resp.stream_len = block.get_block_length()
        resp.status = falcon.HTTP_200
        resp.content_type = 'application/octet-stream'
Esempio n. 4
0
    def on_get(self, req, resp, vault_id, storage_block_id):
        """Returns a specific block from storage alone"""
        storage = BlockStorage.get(vault_id)

        if storage is None:
            logger.error("Vault [{0}] does not exist".format(vault_id))
            raise errors.HTTPNotFound

        block = storage.get_block(storage_block_id)

        if block is None:
            logger.error("block [{0}] does not exist".format(storage_block_id))
            raise errors.HTTPNotFound

        ref_cnt = block.get_ref_count() if block.metadata_block_id else 0
        ref_mod = block.get_ref_modified() if block.metadata_block_id else 0

        resp.set_header("X-Block-Reference-Count", str(ref_cnt))
        resp.set_header("X-Ref-Modified", str(ref_mod))

        resp.set_header("X-Storage-ID", str(storage_block_id))
        resp.set_header("X-Block-ID", str(block.metadata_block_id))

        resp.stream = block.get_obj()
        resp.stream_len = block.get_block_length()
        resp.status = falcon.HTTP_200
        resp.content_type = "application/octet-stream"
Esempio n. 5
0
    def on_get(self, req, resp, vault_id):
        """List the blocks in the vault from storage-alone
        """
        vault = Vault.get(vault_id)
        if vault is None:
            logger.error("Vault [{0}] does not exist".format(vault_id))
            raise errors.HTTPNotFound

        inmarker = req.get_param("marker") if req.get_param("marker") else None
        limit = (
            req.get_param_as_int("limit")
            if req.get_param_as_int("limit")
            else conf.api_configuration.default_returned_num
        )

        # We actually fetch the user's requested
        # limit +1 to detect if the list is being
        # truncated or not.
        storage = BlockStorage.get(vault_id)
        storage_blocks = storage.get_blocks_generator(inmarker, limit + 1)

        responses = list(storage_blocks)

        # Was the list truncated? See note above about +1
        truncated = len(responses) > 0 and len(responses) == limit + 1

        outmarker = responses.pop().storage_block_id if truncated else None

        if outmarker:
            query_args = {"marker": outmarker}
            query_args["limit"] = limit
            returl = set_qs_on_url(req.url, query_args)
            resp.set_header("X-Next-Batch", returl)

        resp.body = json.dumps([response.storage_block_id for response in responses])
Esempio n. 6
0
    def on_delete(self, req, resp, vault_id, storage_block_id):
        """Deletes a storage_block_id from a given vault_id in
        the storage after verifying it does not exist
        in metadata (due diligence applies)
        """
        storage = BlockStorage.get(vault_id)

        assert storage is not None

        try:

            response = storage.delete_block(storage_block_id)
            if response:
                resp.status = falcon.HTTP_204
            else:
                resp.status = falcon.HTTP_404

        except ConstraintError as ex:
            logger.error(str(ex))
            raise errors.HTTPConflict(str(ex))
Esempio n. 7
0
    def on_delete(self, req, resp, vault_id, storage_block_id):
        """Deletes a storage_block_id from a given vault_id in
        the storage after verifying it does not exist
        in metadata (due diligence applies)
        """
        storage = BlockStorage.get(vault_id)

        assert storage is not None

        try:

            response = storage.delete_block(storage_block_id)
            if response:
                resp.status = falcon.HTTP_204
            else:
                resp.status = falcon.HTTP_404

        except ConstraintError as ex:
            logger.error(str(ex))
            raise errors.HTTPConflict(str(ex))
Esempio n. 8
0
    def on_head(self, req, resp, vault_id, storage_block_id):
        """Returns the block data from storage alone"""
        storage = BlockStorage.get(vault_id)

        if storage is None:
            logger.error("Vault [{0}] does not exist".format(vault_id))
            raise errors.HTTPNotFound

        storage_block_info = storage.head_block(storage_block_id)

        if storage_block_info is None:
            logger.error("Block [{0}] does not exist in storage".format(storage_block_id))
            raise errors.HTTPNotFound

        resp.set_header("X-Block-Reference-Count", str(storage_block_info["reference"]["count"]))
        resp.set_header("X-Ref-Modified", str(storage_block_info["reference"]["modified"]))
        resp.set_header("X-Storage-ID", str(storage_block_info["id"]["storage"]))
        resp.set_header("X-Block-ID", str(storage_block_info["id"]["metadata"]))
        resp.set_header("X-Block-Size", str(storage_block_info["length"]))
        resp.set_header("X-Block-Orphaned", str(storage_block_info["orphaned"]))

        resp.status = falcon.HTTP_204