def _check_cheese_removal(self, local_rpm_path: Path): parent_subvol = layer_resource_subvol( __package__, 'test-with-one-local-rpm', ) with TempSubvolumes(sys.argv[0]) as temp_subvolumes: # ensure cheese2 is installed in the parent from rpm-test-cheese-2-1 assert os.path.isfile(parent_subvol.path('/rpm_test/cheese2.txt')) subvol = temp_subvolumes.snapshot(parent_subvol, 'remove_cheese') RpmActionItem.get_phase_builder( [ RpmActionItem( from_target='t', source=local_rpm_path, action=RpmAction.remove_if_exists, ) ], self._opts(), )(subvol) subvol.run_as_root([ 'rm', '-rf', subvol.path('dev'), subvol.path('etc'), subvol.path('meta'), subvol.path('var'), ]) self.assertEqual( [ '(Dir)', { # No more `rpm_test/cheese2.txt` here. } ], render_subvol(subvol))
def _temp_resource_subvol(self, name: str): parent_sv = layer_resource_subvol(__package__, name) with TempSubvolumes(sys.argv[0]) as temp_subvols: # Cannot use `.snapshot()` since that doesn't handle mounts. child_sv = temp_subvols.caller_will_create(name) ParentLayerItem.get_phase_builder([ ParentLayerItem(from_target='t', subvol=parent_sv), ], DUMMY_LAYER_OPTS)(child_sv) yield child_sv
def test_contents(self): self.maxDiff = None sv = layer_resource_subvol(__package__, 'install-toy-rpm') r = render_sendstream(sv.mark_readonly_and_get_sendstream()) self.assertEqual([ '(Dir)', {'bin': ['(Dir)', {'toy_src_file': ['(File m755 d40)']}]} ], pop_path(r, 'usr')) check_common_rpm_render(self, r, 'yum')
def test_clone_demo_sendstream(self): src_subvol = layer_resource_subvol(__package__, 'create_ops') ci = self._clone_item( '/', '/', omit_outer_dir=True, pre_existing_dest=True, subvol=src_subvol, ) self.assertEqual({require_directory('/')}, set(ci.requires())) self.assertGreater(len(set(ci.provides())), 1) with TempSubvolumes(sys.argv[0]) as temp_subvols: dest_subvol = temp_subvols.create('create_ops') ci.build(dest_subvol, DUMMY_LAYER_OPTS) self.assertEqual( render_subvol(src_subvol), render_subvol(dest_subvol), )
def test_rpm_action_item_auto_downgrade(self): parent_subvol = layer_resource_subvol( __package__, 'test-with-one-local-rpm', ) src_rpm = Path(__file__).dirname() / "rpm-test-cheese-1-1.rpm" with TempSubvolumes(sys.argv[0]) as temp_subvolumes: # ensure cheese2 is installed in the parent from rpm-test-cheese-2-1 assert os.path.isfile(parent_subvol.path('/rpm_test/cheese2.txt')) # make sure the RPM we are installing is older in order to # trigger the downgrade src_data = RpmMetadata.from_file(src_rpm) subvol_data = RpmMetadata.from_subvol(parent_subvol, src_data.name) assert compare_rpm_versions(src_data, subvol_data) < 0 subvol = temp_subvolumes.snapshot(parent_subvol, 'rpm_action') RpmActionItem.get_phase_builder( [ RpmActionItem( from_target='t', source=src_rpm, action=RpmAction.install, ) ], self._opts(), )(subvol) subvol.run_as_root([ 'rm', '-rf', subvol.path('dev'), subvol.path('etc'), subvol.path('meta'), subvol.path('var'), ]) self.assertEqual([ '(Dir)', { 'rpm_test': ['(Dir)', { 'cheese1.txt': ['(File d42)'], }], } ], render_subvol(subvol))
def _test_rpm_action_item_install_local_setup(self): parent_subvol = layer_resource_subvol(__package__, 'test-with-no-rpm') local_rpm_path = Path(__file__).dirname() / 'rpm-test-cheese-2-1.rpm' with TempSubvolumes(sys.argv[0]) as temp_subvolumes: subvol = temp_subvolumes.snapshot(parent_subvol, 'add_cheese') RpmActionItem.get_phase_builder( [ RpmActionItem( from_target='t', source=local_rpm_path, action=RpmAction.install, ) ], self._opts(), )(subvol) r = render_subvol(subvol) self.assertEqual(['(Dir)', { 'cheese2.txt': ['(File d45)'], }], pop_path(r, 'rpm_test')) yield r
from fs_image.compiler.requires_provides import ( ProvidesDirectory, ProvidesDoNotAccess, ProvidesFile, require_directory, ) from fs_image.tests.layer_resource import layer_resource_subvol from fs_image.tests.temp_subvolumes import TempSubvolumes from ..common import image_source_item from ..clone import CloneItem from .common import BaseItemTestCase, DUMMY_LAYER_OPTS, pop_path, render_subvol _SRC_SUBVOL = layer_resource_subvol(__package__, 'src-layer') class InstallFileItemTestCase(BaseItemTestCase): def _clone_item( self, src, dest, *, omit_outer_dir=False, pre_existing_dest=False, subvol=None, ): subvol = subvol or _SRC_SUBVOL # The dummy object works here because `subvolumes_dir` of `None` # runs `artifacts_dir` internally, while our "prod" path uses the
def test_rpm_action_item_build_appliance(self): self._check_rpm_action_item_build_appliance( layer_resource_subvol( __package__, 'host-test-build-appliance', ))
def _build_appliance() -> Subvol: return layer_resource_subvol(__package__, 'build-appliance')
def get_dummy_layer_opts_ba(): return DUMMY_LAYER_OPTS._replace(build_appliance=layer_resource_subvol( __package__, 'host-test-build-appliance', ))