Handle invalid tar layers and add tests

This commit is contained in:
Joseph Schorr 2014-11-10 18:26:37 -05:00
parent cc9d5798b3
commit 611bc895e1
2 changed files with 55 additions and 0 deletions

View file

@ -3,6 +3,7 @@ import tarfile
from StringIO import StringIO
from util.streamlayerformat import StreamLayerMerger, AUFS_WHITEOUT
from util.tarlayerformat import TarLayerReadException
class TestStreamLayerMerger(unittest.TestCase):
def create_layer(self, **kwargs):
@ -30,6 +31,9 @@ class TestStreamLayerMerger(unittest.TestCase):
return output.getvalue()
def create_empty_layer(self):
return ''
def squash_layers(self, layers):
def get_layers():
return [StringIO(layer) for layer in layers]
@ -337,6 +341,7 @@ class TestStreamLayerMerger(unittest.TestCase):
self.assertHasFile(squashed, 'foobar/baz/some_file', 'foo')
self.assertDoesNotHaveFile(squashed, 'foo/another_file')
def test_delete_root_directory(self):
third_layer = self.create_layer(
foo = 'build/first_file',
@ -350,5 +355,45 @@ class TestStreamLayerMerger(unittest.TestCase):
self.assertDoesNotHaveFile(squashed, 'build/first_file')
self.assertDoesNotHaveFile(squashed, 'build/second_file')
def test_tar_empty_layer(self):
third_layer = self.create_layer(
foo = 'build/first_file',
bar = 'build/second_file')
empty_layer = self.create_layer()
squashed = self.squash_layers([empty_layer, third_layer])
self.assertHasFile(squashed, 'build/first_file', 'foo')
self.assertHasFile(squashed, 'build/second_file', 'bar')
def test_data_empty_layer(self):
third_layer = self.create_layer(
foo = 'build/first_file',
bar = 'build/second_file')
empty_layer = self.create_empty_layer()
squashed = self.squash_layers([empty_layer, third_layer])
self.assertHasFile(squashed, 'build/first_file', 'foo')
self.assertHasFile(squashed, 'build/second_file', 'bar')
def test_broken_layer(self):
third_layer = self.create_layer(
foo = 'build/first_file',
bar = 'build/second_file')
broken_layer = 'not valid data'
try:
self.squash_layers([broken_layer, third_layer])
self.fail('Expected exception')
except TarLayerReadException as ex:
self.assertEquals('Could not read layer', ex.message)
if __name__ == '__main__':
unittest.main()

View file

@ -1,6 +1,11 @@
import os
import tarfile
class TarLayerReadException(Exception):
""" Exception raised when reading a layer has failed. """
pass
class TarLayerFormat(object):
""" Class which creates a generator of the combined TAR data. """
def __init__(self, tar_iterator):
@ -10,9 +15,14 @@ class TarLayerFormat(object):
for current_tar in self.tar_iterator():
# Read the current TAR. If it is empty, we just continue
# to the next one.
tar_file = None
try:
tar_file = tarfile.open(mode='r|*', fileobj=current_tar)
except tarfile.ReadError as re:
if re.message != 'empty file':
raise TarLayerReadException('Could not read layer')
if not tar_file:
continue
# For each of the tar entries, yield them IF and ONLY IF we have not