Wrap calls to pyeclib_c in core.py with try/catch and wrote example
test to validate exceptions.
This commit is contained in:
parent
eb572055f8
commit
f48656c5d7
|
@ -24,6 +24,7 @@
|
|||
from ec_iface import PyECLib_FRAGHDRCHKSUM_Types
|
||||
import math
|
||||
import pyeclib_c
|
||||
from pyeclib_c import error as PyECLibError
|
||||
import sys
|
||||
|
||||
pyver = float('%s.%s' % sys.version_info[:2])
|
||||
|
@ -92,7 +93,10 @@ class ECPyECLibDriver(object):
|
|||
if len(fragment_payloads) < self.k:
|
||||
raise ECPyECLibException("Not enough fragments given in ECPyECLibDriver.decode")
|
||||
|
||||
ret = pyeclib_c.decode(self.handle, fragment_payloads, fragment_len, ranges, force_metadata_checks)
|
||||
try:
|
||||
ret = pyeclib_c.decode(self.handle, fragment_payloads, fragment_len, ranges, force_metadata_checks)
|
||||
except PyECLibError as e:
|
||||
raise ECPyECLibException(e)
|
||||
|
||||
# Was there an error decoding
|
||||
if ret is None:
|
||||
|
@ -116,30 +120,48 @@ class ECPyECLibDriver(object):
|
|||
|
||||
while len(_indexes_to_reconstruct) > 0:
|
||||
index = _indexes_to_reconstruct.pop(0)
|
||||
reconstructed = pyeclib_c.reconstruct(
|
||||
self.handle, _fragment_payloads, fragment_len, index)
|
||||
try:
|
||||
reconstructed = pyeclib_c.reconstruct(
|
||||
self.handle, _fragment_payloads, fragment_len, index)
|
||||
except PyECLibError as e:
|
||||
raise ECPyECLibException(e)
|
||||
reconstructed_data.append(reconstructed)
|
||||
_fragment_payloads.append(reconstructed)
|
||||
|
||||
return reconstructed_data
|
||||
|
||||
def fragments_needed(self, reconstruct_indexes, exclude_indexes):
|
||||
return pyeclib_c.get_required_fragments(
|
||||
try:
|
||||
required_fragments = pyeclib_c.get_required_fragments(
|
||||
self.handle, reconstruct_indexes, exclude_indexes)
|
||||
return required_fragments
|
||||
except PyECLibError as e:
|
||||
raise ECPyECLibException(e)
|
||||
|
||||
def min_parity_fragments_needed(self):
|
||||
""" FIXME - fix this to return a function of HD """
|
||||
return 1
|
||||
|
||||
def get_metadata(self, fragment, formatted = 0):
|
||||
return pyeclib_c.get_metadata(self.handle, fragment, formatted)
|
||||
try:
|
||||
fragment_metadata = pyeclib_c.get_metadata(self.handle, fragment, formatted)
|
||||
return fragment_metadata
|
||||
except PyECLibError as e:
|
||||
raise ECPyECLibException(e)
|
||||
|
||||
def verify_stripe_metadata(self, fragment_metadata_list):
|
||||
return pyeclib_c.check_metadata(self.handle, fragment_metadata_list)
|
||||
try:
|
||||
success = pyeclib_c.check_metadata(self.handle, fragment_metadata_list)
|
||||
return success
|
||||
except PyECLibError as e:
|
||||
raise ECPyECLibException(e)
|
||||
|
||||
def get_segment_info(self, data_len, segment_size):
|
||||
return pyeclib_c.get_segment_info(self.handle, data_len, segment_size)
|
||||
|
||||
try:
|
||||
segment_info = pyeclib_c.get_segment_info(self.handle, data_len, segment_size)
|
||||
return segment_info
|
||||
except PyECLibError as e:
|
||||
raise ECPyECLibException(e)
|
||||
|
||||
class ECNullDriver(object):
|
||||
|
||||
|
|
|
@ -698,7 +698,7 @@ pyeclib_c_decode(PyObject *self, PyObject *args)
|
|||
Py_ssize_t len = 0;
|
||||
PyBytes_AsStringAndSize(tmp_data, &(c_fragments[i]), &len);
|
||||
}
|
||||
|
||||
|
||||
ret = liberasurecode_decode(pyeclib_handle->ec_desc,
|
||||
c_fragments,
|
||||
num_fragments,
|
||||
|
|
|
@ -26,6 +26,7 @@ from string import ascii_letters, ascii_uppercase, digits
|
|||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
from pyeclib.core import ECPyECLibException
|
||||
|
||||
from pyeclib.ec_iface import ECDriver, VALID_EC_TYPES, ECDriverError, \
|
||||
PyECLib_EC_Types
|
||||
|
@ -495,14 +496,6 @@ class TestPyECLibDriver(unittest.TestCase):
|
|||
reconstructed_fragments[0] == orig_fragments[
|
||||
idxs_to_remove[0]])
|
||||
|
||||
#
|
||||
# Test reconstructor with insufficient fragments
|
||||
#
|
||||
try:
|
||||
pyeclib_driver.reconstruct([fragments[0]], [])
|
||||
except pyeclib_c.error as e:
|
||||
self.assertTrue(e.message.find("Insufficient number of fragments") > -1)
|
||||
|
||||
#
|
||||
# Test decode with integrity checks
|
||||
#
|
||||
|
@ -524,7 +517,28 @@ class TestPyECLibDriver(unittest.TestCase):
|
|||
except:
|
||||
got_exception = True
|
||||
self.assertTrue(got_exception)
|
||||
def test_liberasurecode_error(self):
|
||||
pyeclib_driver = self.get_available_backend(k=10, m=5, ec_type="flat_xor_hd_3")
|
||||
file_size = self.file_sizes[0]
|
||||
tmp_file = self.files[file_size]
|
||||
tmp_file.seek(0)
|
||||
whole_file_str = tmp_file.read()
|
||||
whole_file_bytes = whole_file_str.encode('utf-8')
|
||||
hit_exception = False
|
||||
|
||||
fragments = pyeclib_driver.encode(whole_file_bytes)
|
||||
|
||||
#
|
||||
# Test reconstructor with insufficient fragments
|
||||
#
|
||||
try:
|
||||
pyeclib_driver.reconstruct([fragments[0]], [1,2,3,4,5,6])
|
||||
except ECPyECLibException as e:
|
||||
hit_exception = True
|
||||
self.assertTrue(e.error_str.__str__().find("Insufficient number of fragments") > -1)
|
||||
|
||||
self.assertTrue(hit_exception)
|
||||
|
||||
def test_min_parity_fragments_needed(self):
|
||||
pyeclib_drivers = []
|
||||
pyeclib_drivers.append(ECDriver(k=12, m=2, ec_type="jerasure_rs_vand"))
|
||||
|
|
Loading…
Reference in New Issue