tests: add tests for qvm-template reinstall/up/downgrade when nothing needs to be done
This commit is contained in:
parent
a9d03d199b
commit
4083b74284
@ -4058,6 +4058,95 @@ test-vm : Qubes template for fedora-31
|
|||||||
])
|
])
|
||||||
self.assertAllCalled()
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
@mock.patch('os.rename')
|
||||||
|
@mock.patch('os.makedirs')
|
||||||
|
@mock.patch('subprocess.check_call')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.confirm_action')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.extract_rpm')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.download')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.get_dl_list')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.verify_rpm')
|
||||||
|
def test_201_reinstall_fail_noversion(
|
||||||
|
self,
|
||||||
|
mock_verify,
|
||||||
|
mock_dl_list,
|
||||||
|
mock_dl,
|
||||||
|
mock_extract,
|
||||||
|
mock_confirm,
|
||||||
|
mock_call,
|
||||||
|
mock_mkdirs,
|
||||||
|
mock_rename):
|
||||||
|
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
|
||||||
|
b'0\x00test-vm class=TemplateVM state=Halted\n'
|
||||||
|
for key, val in [
|
||||||
|
('name', 'test-vm'),
|
||||||
|
('epoch', '2'),
|
||||||
|
('version', '4.1'),
|
||||||
|
('release', '2021')]:
|
||||||
|
self.app.expected_calls[(
|
||||||
|
'test-vm',
|
||||||
|
'admin.vm.feature.Get',
|
||||||
|
f'template-{key}',
|
||||||
|
None)] = b'0\0' + val.encode()
|
||||||
|
rpm_hdr = {
|
||||||
|
rpm.RPMTAG_NAME : 'qubes-template-test-vm',
|
||||||
|
rpm.RPMTAG_BUILDTIME : 1598970600,
|
||||||
|
rpm.RPMTAG_DESCRIPTION : 'Desc\ndesc',
|
||||||
|
rpm.RPMTAG_EPOCHNUM : 2,
|
||||||
|
rpm.RPMTAG_LICENSE : 'GPL',
|
||||||
|
rpm.RPMTAG_RELEASE : '2020',
|
||||||
|
rpm.RPMTAG_SUMMARY : 'Summary',
|
||||||
|
rpm.RPMTAG_URL : 'https://qubes-os.org',
|
||||||
|
rpm.RPMTAG_VERSION : '4.1'
|
||||||
|
}
|
||||||
|
mock_dl.return_value = {'test-vm': rpm_hdr}
|
||||||
|
dl_list = {
|
||||||
|
'test-vm': qubesadmin.tools.qvm_template.DlEntry(
|
||||||
|
('1', '4.1', '2020'), 'qubes-templates-itl', 1048576)
|
||||||
|
}
|
||||||
|
mock_dl_list.return_value = dl_list
|
||||||
|
selector = qubesadmin.tools.qvm_template.VersionSelector.REINSTALL
|
||||||
|
with mock.patch('qubesadmin.tools.qvm_template.LOCK_FILE', '/tmp/test.lock'), \
|
||||||
|
self.assertRaises(SystemExit) as e, \
|
||||||
|
mock.patch('sys.stderr', new=io.StringIO()) as mock_err:
|
||||||
|
args = argparse.Namespace(
|
||||||
|
templates=['test-vm'],
|
||||||
|
keyring='/tmp/keyring.gpg',
|
||||||
|
nogpgcheck=False,
|
||||||
|
cachedir='/var/cache/qvm-template',
|
||||||
|
repo_files=[],
|
||||||
|
releasever='4.1',
|
||||||
|
yes=False,
|
||||||
|
keep_cache=True,
|
||||||
|
allow_pv=False,
|
||||||
|
pool=None
|
||||||
|
)
|
||||||
|
qubesadmin.tools.qvm_template.install(args, self.app,
|
||||||
|
version_selector=selector,
|
||||||
|
override_existing=True)
|
||||||
|
self.assertIn(
|
||||||
|
'Same version of template \'test-vm\' not found',
|
||||||
|
mock_err.getvalue())
|
||||||
|
# Attempt to get download list
|
||||||
|
self.assertEqual(mock_dl_list.mock_calls, [
|
||||||
|
mock.call(args, self.app, version_selector=selector)
|
||||||
|
])
|
||||||
|
mock_dl.assert_called_with(args, self.app,
|
||||||
|
dl_list=dl_list, version_selector=selector)
|
||||||
|
# already verified by download()
|
||||||
|
self.assertEqual(mock_verify.mock_calls, [])
|
||||||
|
# Expect override confirmation
|
||||||
|
self.assertEqual(mock_confirm.mock_calls,
|
||||||
|
[mock.call(re_str(r'.*override changes.*:'), ['test-vm'])])
|
||||||
|
# Nothing extracted / installed
|
||||||
|
mock_extract.assert_not_called()
|
||||||
|
mock_call.assert_not_called()
|
||||||
|
# Cache directory created
|
||||||
|
self.assertEqual(mock_mkdirs.mock_calls, [
|
||||||
|
mock.call(args.cachedir, exist_ok=True)
|
||||||
|
])
|
||||||
|
self.assertAllCalled()
|
||||||
|
|
||||||
@mock.patch('qubesadmin.tools.qvm_remove.main')
|
@mock.patch('qubesadmin.tools.qvm_remove.main')
|
||||||
@mock.patch('qubesadmin.tools.qvm_template.confirm_action')
|
@mock.patch('qubesadmin.tools.qvm_template.confirm_action')
|
||||||
def test_210_remove_success(self, mock_confirm, mock_remove):
|
def test_210_remove_success(self, mock_confirm, mock_remove):
|
||||||
@ -4361,3 +4450,173 @@ gpgkey = file:///etc/qubes/repo-templates/keys/RPM-GPG-KEY-qubes-$releasever-pri
|
|||||||
'/etc/qubes/repo-templates/keys/RPM-GPG-KEY-qubes-r4.1-primary-testing'
|
'/etc/qubes/repo-templates/keys/RPM-GPG-KEY-qubes-r4.1-primary-testing'
|
||||||
})
|
})
|
||||||
self.assertAllCalled()
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
@mock.patch('os.rename')
|
||||||
|
@mock.patch('os.makedirs')
|
||||||
|
@mock.patch('subprocess.check_call')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.confirm_action')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.extract_rpm')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.download')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.get_dl_list')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.verify_rpm')
|
||||||
|
def test_220_downgrade_skip_lower(
|
||||||
|
self,
|
||||||
|
mock_verify,
|
||||||
|
mock_dl_list,
|
||||||
|
mock_dl,
|
||||||
|
mock_extract,
|
||||||
|
mock_confirm,
|
||||||
|
mock_call,
|
||||||
|
mock_mkdirs,
|
||||||
|
mock_rename):
|
||||||
|
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
|
||||||
|
b'0\x00test-vm class=TemplateVM state=Halted\n'
|
||||||
|
for key, val in [
|
||||||
|
('name', 'test-vm'),
|
||||||
|
('epoch', '2'),
|
||||||
|
('version', '4.1'),
|
||||||
|
('release', '2020')]:
|
||||||
|
self.app.expected_calls[(
|
||||||
|
'test-vm',
|
||||||
|
'admin.vm.feature.Get',
|
||||||
|
f'template-{key}',
|
||||||
|
None)] = b'0\0' + val.encode()
|
||||||
|
rpm_hdr = {
|
||||||
|
rpm.RPMTAG_NAME : 'qubes-template-test-vm',
|
||||||
|
rpm.RPMTAG_BUILDTIME : 1598970600,
|
||||||
|
rpm.RPMTAG_DESCRIPTION : 'Desc\ndesc',
|
||||||
|
rpm.RPMTAG_EPOCHNUM : 2,
|
||||||
|
rpm.RPMTAG_LICENSE : 'GPL',
|
||||||
|
rpm.RPMTAG_RELEASE : '2021',
|
||||||
|
rpm.RPMTAG_SUMMARY : 'Summary',
|
||||||
|
rpm.RPMTAG_URL : 'https://qubes-os.org',
|
||||||
|
rpm.RPMTAG_VERSION : '4.1'
|
||||||
|
}
|
||||||
|
mock_verify.return_value = rpm_hdr
|
||||||
|
mock_dl_list.return_value = {}
|
||||||
|
selector = qubesadmin.tools.qvm_template.VersionSelector.LATEST_LOWER
|
||||||
|
with mock.patch('qubesadmin.tools.qvm_template.LOCK_FILE', '/tmp/test.lock'), \
|
||||||
|
tempfile.NamedTemporaryFile(suffix='.rpm') as template_file, \
|
||||||
|
mock.patch('sys.stderr', new=io.StringIO()) as mock_err:
|
||||||
|
args = argparse.Namespace(
|
||||||
|
templates=[template_file.name],
|
||||||
|
keyring='/tmp/keyring.gpg',
|
||||||
|
nogpgcheck=False,
|
||||||
|
cachedir='/var/cache/qvm-template',
|
||||||
|
repo_files=[],
|
||||||
|
releasever='4.1',
|
||||||
|
yes=False,
|
||||||
|
keep_cache=True,
|
||||||
|
allow_pv=False,
|
||||||
|
pool=None
|
||||||
|
)
|
||||||
|
qubesadmin.tools.qvm_template.install(args, self.app,
|
||||||
|
version_selector=selector,
|
||||||
|
override_existing=True)
|
||||||
|
self.assertIn(
|
||||||
|
'lower version already installed',
|
||||||
|
mock_err.getvalue())
|
||||||
|
# Attempt to get download list
|
||||||
|
self.assertEqual(mock_dl_list.mock_calls, [
|
||||||
|
mock.call(args, self.app, version_selector=selector)
|
||||||
|
])
|
||||||
|
mock_dl.assert_called_with(args, self.app,
|
||||||
|
dl_list={}, version_selector=selector)
|
||||||
|
self.assertEqual(mock_verify.mock_calls, [
|
||||||
|
mock.call(template_file.name, '/tmp/keyring.gpg', nogpgcheck=False)
|
||||||
|
])
|
||||||
|
# No confirmation since nothing needs to be done
|
||||||
|
mock_confirm.assert_not_called()
|
||||||
|
# Nothing extracted / installed
|
||||||
|
mock_extract.assert_not_called()
|
||||||
|
mock_call.assert_not_called()
|
||||||
|
# Cache directory created
|
||||||
|
self.assertEqual(mock_mkdirs.mock_calls, [
|
||||||
|
mock.call(args.cachedir, exist_ok=True)
|
||||||
|
])
|
||||||
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
@mock.patch('os.rename')
|
||||||
|
@mock.patch('os.makedirs')
|
||||||
|
@mock.patch('subprocess.check_call')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.confirm_action')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.extract_rpm')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.download')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.get_dl_list')
|
||||||
|
@mock.patch('qubesadmin.tools.qvm_template.verify_rpm')
|
||||||
|
def test_221_upgrade_skip_higher(
|
||||||
|
self,
|
||||||
|
mock_verify,
|
||||||
|
mock_dl_list,
|
||||||
|
mock_dl,
|
||||||
|
mock_extract,
|
||||||
|
mock_confirm,
|
||||||
|
mock_call,
|
||||||
|
mock_mkdirs,
|
||||||
|
mock_rename):
|
||||||
|
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
|
||||||
|
b'0\x00test-vm class=TemplateVM state=Halted\n'
|
||||||
|
for key, val in [
|
||||||
|
('name', 'test-vm'),
|
||||||
|
('epoch', '2'),
|
||||||
|
('version', '4.1'),
|
||||||
|
('release', '2021')]:
|
||||||
|
self.app.expected_calls[(
|
||||||
|
'test-vm',
|
||||||
|
'admin.vm.feature.Get',
|
||||||
|
f'template-{key}',
|
||||||
|
None)] = b'0\0' + val.encode()
|
||||||
|
rpm_hdr = {
|
||||||
|
rpm.RPMTAG_NAME : 'qubes-template-test-vm',
|
||||||
|
rpm.RPMTAG_BUILDTIME : 1598970600,
|
||||||
|
rpm.RPMTAG_DESCRIPTION : 'Desc\ndesc',
|
||||||
|
rpm.RPMTAG_EPOCHNUM : 2,
|
||||||
|
rpm.RPMTAG_LICENSE : 'GPL',
|
||||||
|
rpm.RPMTAG_RELEASE : '2020',
|
||||||
|
rpm.RPMTAG_SUMMARY : 'Summary',
|
||||||
|
rpm.RPMTAG_URL : 'https://qubes-os.org',
|
||||||
|
rpm.RPMTAG_VERSION : '4.1'
|
||||||
|
}
|
||||||
|
mock_verify.return_value = rpm_hdr
|
||||||
|
mock_dl_list.return_value = {}
|
||||||
|
selector = qubesadmin.tools.qvm_template.VersionSelector.LATEST_HIGHER
|
||||||
|
with mock.patch('qubesadmin.tools.qvm_template.LOCK_FILE', '/tmp/test.lock'), \
|
||||||
|
tempfile.NamedTemporaryFile(suffix='.rpm') as template_file, \
|
||||||
|
mock.patch('sys.stderr', new=io.StringIO()) as mock_err:
|
||||||
|
args = argparse.Namespace(
|
||||||
|
templates=[template_file.name],
|
||||||
|
keyring='/tmp/keyring.gpg',
|
||||||
|
nogpgcheck=False,
|
||||||
|
cachedir='/var/cache/qvm-template',
|
||||||
|
repo_files=[],
|
||||||
|
releasever='4.1',
|
||||||
|
yes=False,
|
||||||
|
keep_cache=True,
|
||||||
|
allow_pv=False,
|
||||||
|
pool=None
|
||||||
|
)
|
||||||
|
qubesadmin.tools.qvm_template.install(args, self.app,
|
||||||
|
version_selector=selector,
|
||||||
|
override_existing=True)
|
||||||
|
self.assertIn(
|
||||||
|
'higher version already installed',
|
||||||
|
mock_err.getvalue())
|
||||||
|
# Attempt to get download list
|
||||||
|
self.assertEqual(mock_dl_list.mock_calls, [
|
||||||
|
mock.call(args, self.app, version_selector=selector)
|
||||||
|
])
|
||||||
|
mock_dl.assert_called_with(args, self.app,
|
||||||
|
dl_list={}, version_selector=selector)
|
||||||
|
self.assertEqual(mock_verify.mock_calls, [
|
||||||
|
mock.call(template_file.name, '/tmp/keyring.gpg', nogpgcheck=False)
|
||||||
|
])
|
||||||
|
# No confirmation since nothing needs to be done
|
||||||
|
mock_confirm.assert_not_called()
|
||||||
|
# Nothing extracted / installed
|
||||||
|
mock_extract.assert_not_called()
|
||||||
|
mock_call.assert_not_called()
|
||||||
|
# Cache directory created
|
||||||
|
self.assertEqual(mock_mkdirs.mock_calls, [
|
||||||
|
mock.call(args.cachedir, exist_ok=True)
|
||||||
|
])
|
||||||
|
self.assertAllCalled()
|
||||||
|
Loading…
Reference in New Issue
Block a user