def test_no_fstab(self): """ Handle images which do not include an fstab. """ self.assertFalse(os.path.exists(cc_mounts.FSTAB_PATH)) fstab_expected_content = ('%s\tnone\tswap\tsw,comment=cloudconfig\t' '0\t0\n' % (self.swap_path, )) cc_mounts.handle(None, {}, self.mock_cloud, self.mock_log, []) with open(cc_mounts.FSTAB_PATH, 'r') as fd: fstab_new_content = fd.read() self.assertEqual(fstab_expected_content, fstab_new_content)
def test_swap_integrity(self): '''Ensure that the swap file is correctly created and can swapon successfully. Fixing the corner case of: kernel: swapon: swapfile has holes''' fstab = '/swap.img swap swap defaults 0 0\n' with open(cc_mounts.FSTAB_PATH, 'w') as fd: fd.write(fstab) cc = {'swap': ['filename: /swap.img', 'size: 512', 'maxsize: 512']} cc_mounts.handle(None, cc, self.mock_cloud, self.mock_log, [])
def test_swap_integrity(self): """Ensure that the swap file is correctly created and can swapon successfully. Fixing the corner case of: kernel: swapon: swapfile has holes""" fstab = "/swap.img swap swap defaults 0 0\n" with open(cc_mounts.FSTAB_PATH, "w") as fd: fd.write(fstab) cc = {"swap": ["filename: /swap.img", "size: 512", "maxsize: 512"]} cc_mounts.handle(None, cc, self.mock_cloud, self.mock_log, [])
def test_swap_creation_method_ext4(self, m_kernel_version, m_get_mount_info): m_kernel_version.return_value = (5, 14) m_get_mount_info.return_value = ["", "ext4"] cc_mounts.handle(None, self.cc, self.mock_cloud, self.mock_log, []) self.m_subp_subp.assert_has_calls([ mock.call(["fallocate", "-l", "0M", self.swap_path], capture=True), mock.call(["mkswap", self.swap_path]), mock.call(["swapon", "-a"]), ])
def test_swap_creation_method_ext4(self, m_kernel_version, m_get_mount_info): m_kernel_version.return_value = (5, 14) m_get_mount_info.return_value = ["", "ext4"] cc_mounts.handle(None, self.cc, self.mock_cloud, self.mock_log, []) self.m_subp_subp.assert_has_calls([ mock.call(['fallocate', '-l', '0M', self.swap_path], capture=True), mock.call(['mkswap', self.swap_path]), mock.call(['swapon', '-a']) ])
def test_swap_creation_method_btrfs(self, m_kernel_version, m_get_mount_info): m_kernel_version.return_value = (4, 20) m_get_mount_info.return_value = ["", "btrfs"] cc_mounts.handle(None, self.cc, self.mock_cloud, self.mock_log, []) self.m_subp_subp.assert_has_calls([ mock.call([ 'dd', 'if=/dev/zero', 'of=' + self.swap_path, 'bs=1M', 'count=0' ], capture=True), mock.call(['mkswap', self.swap_path]), mock.call(['swapon', '-a']) ])
def test_fstab_same_swap_device_already_configured(self): '''Ensure that cloud-init will not add a swap device if the same device already exists in /etc/fstab.''' fstab_original_content = '%s swap swap defaults 0 0\n' % ( self.swap_path, ) fstab_expected_content = fstab_original_content with open(cc_mounts.FSTAB_PATH, 'w') as fd: fd.write(fstab_original_content) cc_mounts.handle(None, {}, self.mock_cloud, self.mock_log, []) with open(cc_mounts.FSTAB_PATH, 'r') as fd: fstab_new_content = fd.read() self.assertEqual(fstab_expected_content, fstab_new_content)
def test_fstab_no_swap_device(self): '''Ensure that cloud-init adds a discovered swap partition to /etc/fstab.''' fstab_original_content = '' fstab_expected_content = ('%s\tnone\tswap\tsw,comment=cloudconfig\t' '0\t0\n' % (self.swap_path, )) with open(cc_mounts.FSTAB_PATH, 'w') as fd: fd.write(fstab_original_content) cc_mounts.handle(None, {}, self.mock_cloud, self.mock_log, []) with open(cc_mounts.FSTAB_PATH, 'r') as fd: fstab_new_content = fd.read() self.assertEqual(fstab_expected_content, fstab_new_content)
def test_fstab_same_swap_device_already_configured(self): '''Ensure that cloud-init will not add a swap device if the same device already exists in /etc/fstab.''' fstab_original_content = '%s swap swap defaults 0 0\n' % ( self.swap_path,) fstab_expected_content = fstab_original_content with open(cc_mounts.FSTAB_PATH, 'w') as fd: fd.write(fstab_original_content) cc_mounts.handle(None, {}, self.mock_cloud, self.mock_log, []) with open(cc_mounts.FSTAB_PATH, 'r') as fd: fstab_new_content = fd.read() self.assertEqual(fstab_expected_content, fstab_new_content)
def test_no_change_fstab_sets_needs_mount_all(self): '''verify unchanged fstab entries are mounted if not call mount -a''' fstab_original_content = ( 'LABEL=cloudimg-rootfs / ext4 defaults 0 0\n' 'LABEL=UEFI /boot/efi vfat defaults 0 0\n' '/dev/vdb /mnt auto defaults,noexec,comment=cloudconfig 0 2\n') fstab_expected_content = fstab_original_content cc = {'mounts': [['/dev/vdb', '/mnt', 'auto', 'defaults,noexec']]} with open(cc_mounts.FSTAB_PATH, 'w') as fd: fd.write(fstab_original_content) with open(cc_mounts.FSTAB_PATH, 'r') as fd: fstab_new_content = fd.read() self.assertEqual(fstab_expected_content, fstab_new_content) cc_mounts.handle(None, cc, self.mock_cloud, self.mock_log, []) self.m_util_subp.assert_has_calls([ mock.call(['mount', '-a']), mock.call(['systemctl', 'daemon-reload']) ])
def test_fstab_alternate_swap_device_already_configured(self): '''Ensure that cloud-init will add a discovered swap device to /etc/fstab even when there exists a swap definition on another device.''' fstab_original_content = '/dev/sdc1 swap swap defaults 0 0\n' fstab_expected_content = (fstab_original_content + '%s\tnone\tswap\tsw,comment=cloudconfig\t' '0\t0\n' % (self.swap_path, )) with open(cc_mounts.FSTAB_PATH, 'w') as fd: fd.write(fstab_original_content) cc_mounts.handle(None, {}, self.mock_cloud, self.mock_log, []) with open(cc_mounts.FSTAB_PATH, 'r') as fd: fstab_new_content = fd.read() self.assertEqual(fstab_expected_content, fstab_new_content)
def test_fstab_no_swap_device(self): '''Ensure that cloud-init adds a discovered swap partition to /etc/fstab.''' fstab_original_content = '' fstab_expected_content = ( '%s\tnone\tswap\tsw,comment=cloudconfig\t' '0\t0\n' % (self.swap_path,) ) with open(cc_mounts.FSTAB_PATH, 'w') as fd: fd.write(fstab_original_content) cc_mounts.handle(None, {}, self.mock_cloud, self.mock_log, []) with open(cc_mounts.FSTAB_PATH, 'r') as fd: fstab_new_content = fd.read() self.assertEqual(fstab_expected_content, fstab_new_content)
def test_no_change_fstab_sets_needs_mount_all(self): """verify unchanged fstab entries are mounted if not call mount -a""" fstab_original_content = ( "LABEL=cloudimg-rootfs / ext4 defaults 0 0\n" "LABEL=UEFI /boot/efi vfat defaults 0 0\n" "/dev/vdb /mnt auto defaults,noexec,comment=cloudconfig 0 2\n") fstab_expected_content = fstab_original_content cc = {"mounts": [["/dev/vdb", "/mnt", "auto", "defaults,noexec"]]} with open(cc_mounts.FSTAB_PATH, "w") as fd: fd.write(fstab_original_content) with open(cc_mounts.FSTAB_PATH, "r") as fd: fstab_new_content = fd.read() self.assertEqual(fstab_expected_content, fstab_new_content) cc_mounts.handle(None, cc, self.mock_cloud, self.mock_log, []) self.m_subp_subp.assert_has_calls([ mock.call(["mount", "-a"]), mock.call(["systemctl", "daemon-reload"]), ])
def test_no_change_fstab_sets_needs_mount_all(self): '''verify unchanged fstab entries are mounted if not call mount -a''' fstab_original_content = ( 'LABEL=cloudimg-rootfs / ext4 defaults 0 0\n' 'LABEL=UEFI /boot/efi vfat defaults 0 0\n' '/dev/vdb /mnt auto defaults,noexec,comment=cloudconfig 0 2\n' ) fstab_expected_content = fstab_original_content cc = {'mounts': [ ['/dev/vdb', '/mnt', 'auto', 'defaults,noexec']]} with open(cc_mounts.FSTAB_PATH, 'w') as fd: fd.write(fstab_original_content) with open(cc_mounts.FSTAB_PATH, 'r') as fd: fstab_new_content = fd.read() self.assertEqual(fstab_expected_content, fstab_new_content) cc_mounts.handle(None, cc, self.mock_cloud, self.mock_log, []) self.m_util_subp.assert_has_calls([ mock.call(['mount', '-a']), mock.call(['systemctl', 'daemon-reload'])])
def test_fstab_alternate_swap_device_already_configured(self): '''Ensure that cloud-init will add a discovered swap device to /etc/fstab even when there exists a swap definition on another device.''' fstab_original_content = '/dev/sdc1 swap swap defaults 0 0\n' fstab_expected_content = ( fstab_original_content + '%s\tnone\tswap\tsw,comment=cloudconfig\t' '0\t0\n' % (self.swap_path,) ) with open(cc_mounts.FSTAB_PATH, 'w') as fd: fd.write(fstab_original_content) cc_mounts.handle(None, {}, self.mock_cloud, self.mock_log, []) with open(cc_mounts.FSTAB_PATH, 'r') as fd: fstab_new_content = fd.read() self.assertEqual(fstab_expected_content, fstab_new_content)
def test_swap_creation_method_btrfs(self, m_kernel_version, m_get_mount_info): m_kernel_version.return_value = (4, 20) m_get_mount_info.return_value = ["", "btrfs"] cc_mounts.handle(None, self.cc, self.mock_cloud, self.mock_log, []) self.m_subp_subp.assert_has_calls([ mock.call( [ "dd", "if=/dev/zero", "of=" + self.swap_path, "bs=1M", "count=0", ], capture=True, ), mock.call(["mkswap", self.swap_path]), mock.call(["swapon", "-a"]), ])