Source code for pacifica.cartd.archive_requests

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""Module that is used by the cart to send requests to the archive interface."""
from __future__ import absolute_import
from json import dumps
import hashlib
import requests
from .utils import parse_size
from .config import get_config


[docs]class ArchiveRequests(object): """Class that supports all the requests to the archive interface."""
[docs] def __init__(self): """Constructor for setting the AI URL.""" self._url = get_config().get('archiveinterface', 'url')
[docs] def pull_file(self, archive_filename, cart_filepath, hashval, hashtype): """ Pull file from AI. Performs a request that will attempt to write the contents of a file from the archive interface to the specified cart filepath """ xfer_size = parse_size(get_config().get('cartd', 'transfer_size')) resp = requests.get(str(self._url + archive_filename), stream=True) myfile = open(cart_filepath, 'wb+') buf = resp.raw.read(xfer_size) myhash = hashlib.new(hashtype) while buf: myfile.write(buf) myhash.update(buf) buf = resp.raw.read(xfer_size) myfile.close() myhashval = myhash.hexdigest() if myhashval != hashval: raise ValueError('File hash does not match provided hash')
[docs] def stage_file(self, file_name): """Send a post to the archive interface telling it to stage the file.""" resp = requests.post(str(self._url + file_name)) if str(resp.status_code) == '500': raise requests.exceptions.RequestException(str(dumps(resp.text)))
[docs] @staticmethod def _status_dict(headers, file_name): """Return status dictionary from http response headers.""" return { 'message': headers['x-pacifica-messsage'], 'file': file_name, 'filesize': headers['x-content-length'], 'ctime': headers['x-pacifica-ctime'], 'mtime': headers['last-modified'], 'bytes_per_level': headers['x-pacifica-bytes-per-level'], 'file_storage_media': headers['x-pacifica-file-storage-media'] }
[docs] def status_file(self, file_name): """Get a status from the archive interface via Head and returns response.""" resp = requests.head(str(self._url + file_name)) return dumps(self._status_dict(resp.headers, file_name))