Skip to content

Commit

Permalink
Refactor: Modified Class ImageLayer
Browse files Browse the repository at this point in the history
First commit in a string of code refactoring commits to move some
utility modules into classes in an attempt to decouple the process
of extracting or formatting data from the actual data

- Layer is now renamed ImageLayer for clarity
- Image layer property sha is now diff_id for clarity
- Added property tar_file to point to location of the diff filesystem
tarball
- Added property created_by which is not an OCI specification but is
used in images created by Docker
- Added getters for the new properties
- Added setter for created_by
- Modified the unit tests to reflect the changes in the class

Note: This change will break the build

Signed-off-by: Nisha K <[email protected]>
  • Loading branch information
Nisha K committed Jan 13, 2018
1 parent 9e8202b commit 877c0d5
Show file tree
Hide file tree
Showing 4 changed files with 140 additions and 105 deletions.
77 changes: 77 additions & 0 deletions classes/image_layer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
'''
Copyright (c) 2017 VMware, Inc. All Rights Reserved.
SPDX-License-Identifier: BSD-2-Clause
'''


class ImageLayer(object):
'''A representation of a container filesystem layer
attributes:
sha: the sha256 of the layer filesystem
packages: list of objects of type Package (package.py)
tar_file: the path to the layer filesystem tarball
created_by: sometimes the metadata will contain a created_by
key containing the command that created the filesystem layer
methods:
add_package: adds a package to the layer
remove_package: removes a package from the layer
to_dict: returns a dict representation of the instance
get_package_names: returns a list of package names'''
def __init__(self, diff_id, tar_file, created_by=None):
self.__diff_id = diff_id
self.__tar_file = tar_file
self.__created_by = created_by
self.__packages = []

@property
def diff_id(self):
return self.__diff_id

@property
def packages(self):
return self.__packages

@property
def tar_file(self):
return self.__tar_file

@property
def created_by(self):
return self.__created_by

@created_by.setter
def created_by(self, create_string):
self.__created_by = create_string

def add_package(self, package):
self.__packages.append(package)

def remove_package(self, package_name):
rem_index = 0
success = False
for index in range(0, len(self.__packages)):
if self.packages[index].name == package_name:
rem_index = index
success = True
break
if success:
self.__packages.remove(self.__packages[rem_index])
return success

def to_dict(self):
layer_dict = {}
pkg_list = []
for pkg in self.__packages:
pkg_list.append(pkg.to_dict())
layer_dict.update({self.diff_id: {'packages': pkg_list,
'tar_file': self.__tar_file,
'created_by': self.__created_by
}})
return layer_dict

def get_package_names(self):
'''Get the list of package names in this layer'''
pkg_list = []
for pkg in self.packages:
pkg_list.append(pkg.name)
return pkg_list
56 changes: 0 additions & 56 deletions classes/layer.py

This file was deleted.

63 changes: 63 additions & 0 deletions tests/test_class_image_layer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
'''
Copyright (c) 2017 VMware, Inc. All Rights Reserved.
SPDX-License-Identifier: BSD-2-Clause
'''

import unittest

from classes.image_layer import ImageLayer
from classes.package import Package


class TestClassLayer(unittest.TestCase):

def setUp(self):
self.layer = ImageLayer('123abc', 'path/to/tar')

def tearDown(self):
del self.layer

def testInstance(self):
self.assertEqual(self.layer.diff_id, '123abc')
self.assertEqual(self.layer.tar_file, 'path/to/tar')
self.assertFalse(self.layer.packages)
self.assertFalse(self.layer.created_by)
self.assertRaises(AttributeError, setattr, self.layer,
'diff_id', '456def')
self.assertRaises(AttributeError, setattr, self.layer, 'tar_file',
'some/other/path')
self.layer.created_by = 'some string'
self.assertEqual(self.layer.created_by, 'some string')

def testAddPackage(self):
p1 = Package('x')
self.layer.add_package(p1)
self.assertEqual(len(self.layer.packages), 1)

def testRemovePackage(self):
p1 = Package('x')
p2 = Package('y')
self.layer.add_package(p1)
self.layer.add_package(p2)
self.assertTrue(self.layer.remove_package('y'))
self.assertFalse(self.layer.remove_package('y'))

def testToDict(self):
p1 = Package('x')
self.layer.add_package(p1)
a_dict = self.layer.to_dict()
print(a_dict)
self.assertTrue(a_dict['123abc'])
self.assertEqual(len(a_dict['123abc']['packages']), 1)
self.assertEqual(a_dict['123abc']['packages'][0]['name'], 'x')
self.assertEqual(a_dict['123abc']['tar_file'], 'path/to/tar')

def testGetPackageNames(self):
p1 = Package('x')
self.layer.add_package(p1)
pkgs = self.layer.get_package_names()
self.assertEqual(pkgs[0], 'x')


if __name__ == '__main__':
unittest.main()
49 changes: 0 additions & 49 deletions tests/test_class_layer.py

This file was deleted.

0 comments on commit 877c0d5

Please sign in to comment.