tests: add tests for other qvm-template functions
This commit is contained in:
parent
64e9c24054
commit
d1ce8d3a95
@ -291,6 +291,8 @@ class TC_00_qvm_template(qubesadmin.tests.QubesTestCase):
|
|||||||
mock_tmpdir.return_value.__enter__.return_value = \
|
mock_tmpdir.return_value.__enter__.return_value = \
|
||||||
'/var/tmp/qvm-template-tmpdir'
|
'/var/tmp/qvm-template-tmpdir'
|
||||||
qubesadmin.tools.qvm_template.install(args, self.app)
|
qubesadmin.tools.qvm_template.install(args, self.app)
|
||||||
|
# Downloaded package should not be removed
|
||||||
|
self.assertTrue(os.path.exists(path))
|
||||||
# Attempt to get download list
|
# Attempt to get download list
|
||||||
selector = qubesadmin.tools.qvm_template.VersionSelector.LATEST
|
selector = qubesadmin.tools.qvm_template.VersionSelector.LATEST
|
||||||
self.assertEqual(mock_dl_list.mock_calls, [
|
self.assertEqual(mock_dl_list.mock_calls, [
|
||||||
@ -675,6 +677,7 @@ class TC_00_qvm_template(qubesadmin.tests.QubesTestCase):
|
|||||||
self.assertEqual(mock_rename.mock_calls, [])
|
self.assertEqual(mock_rename.mock_calls, [])
|
||||||
self.assertAllCalled()
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
@mock.patch('os.remove')
|
||||||
@mock.patch('os.rename')
|
@mock.patch('os.rename')
|
||||||
@mock.patch('os.makedirs')
|
@mock.patch('os.makedirs')
|
||||||
@mock.patch('subprocess.check_call')
|
@mock.patch('subprocess.check_call')
|
||||||
@ -692,7 +695,8 @@ class TC_00_qvm_template(qubesadmin.tests.QubesTestCase):
|
|||||||
mock_confirm,
|
mock_confirm,
|
||||||
mock_call,
|
mock_call,
|
||||||
mock_mkdirs,
|
mock_mkdirs,
|
||||||
mock_rename):
|
mock_rename,
|
||||||
|
mock_remove):
|
||||||
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = b'0\0'
|
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = b'0\0'
|
||||||
build_time = '2020-09-01 14:30:00' # 1598970600
|
build_time = '2020-09-01 14:30:00' # 1598970600
|
||||||
install_time = '2020-09-01 15:30:00'
|
install_time = '2020-09-01 15:30:00'
|
||||||
@ -745,7 +749,7 @@ class TC_00_qvm_template(qubesadmin.tests.QubesTestCase):
|
|||||||
repo_files=[],
|
repo_files=[],
|
||||||
releasever='4.1',
|
releasever='4.1',
|
||||||
yes=False,
|
yes=False,
|
||||||
keep_cache=True,
|
keep_cache=False,
|
||||||
allow_pv=False,
|
allow_pv=False,
|
||||||
pool=None
|
pool=None
|
||||||
)
|
)
|
||||||
@ -785,6 +789,12 @@ class TC_00_qvm_template(qubesadmin.tests.QubesTestCase):
|
|||||||
])
|
])
|
||||||
# No templates downloaded, thus no renames needed
|
# No templates downloaded, thus no renames needed
|
||||||
self.assertEqual(mock_rename.mock_calls, [])
|
self.assertEqual(mock_rename.mock_calls, [])
|
||||||
|
# Downloaded template is removed
|
||||||
|
self.assertEqual(mock_remove.mock_calls, [
|
||||||
|
mock.call('/var/cache/qvm-template/' \
|
||||||
|
'qubes-template-test-vm-1:4.1-20200101.rpm'),
|
||||||
|
mock.call('/tmp/test.lock')
|
||||||
|
])
|
||||||
self.assertAllCalled()
|
self.assertAllCalled()
|
||||||
|
|
||||||
@mock.patch('os.rename')
|
@mock.patch('os.rename')
|
||||||
@ -3934,6 +3944,7 @@ test-vm : Qubes template for fedora-31
|
|||||||
self.assertEqual(mock_verify_rpm.mock_calls, [])
|
self.assertEqual(mock_verify_rpm.mock_calls, [])
|
||||||
|
|
||||||
|
|
||||||
|
@mock.patch('os.remove')
|
||||||
@mock.patch('os.rename')
|
@mock.patch('os.rename')
|
||||||
@mock.patch('os.makedirs')
|
@mock.patch('os.makedirs')
|
||||||
@mock.patch('subprocess.check_call')
|
@mock.patch('subprocess.check_call')
|
||||||
@ -3951,7 +3962,8 @@ test-vm : Qubes template for fedora-31
|
|||||||
mock_confirm,
|
mock_confirm,
|
||||||
mock_call,
|
mock_call,
|
||||||
mock_mkdirs,
|
mock_mkdirs,
|
||||||
mock_rename):
|
mock_rename,
|
||||||
|
mock_remove):
|
||||||
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
|
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
|
||||||
b'0\x00test-vm class=TemplateVM state=Halted\n'
|
b'0\x00test-vm class=TemplateVM state=Halted\n'
|
||||||
build_time = '2020-09-01 14:30:00' # 1598970600
|
build_time = '2020-09-01 14:30:00' # 1598970600
|
||||||
@ -4056,6 +4068,10 @@ test-vm : Qubes template for fedora-31
|
|||||||
self.assertEqual(mock_mkdirs.mock_calls, [
|
self.assertEqual(mock_mkdirs.mock_calls, [
|
||||||
mock.call(args.cachedir, exist_ok=True)
|
mock.call(args.cachedir, exist_ok=True)
|
||||||
])
|
])
|
||||||
|
# Downloaded package should not be removed
|
||||||
|
self.assertEqual(mock_remove.mock_calls, [
|
||||||
|
mock.call('/tmp/test.lock')
|
||||||
|
])
|
||||||
self.assertAllCalled()
|
self.assertAllCalled()
|
||||||
|
|
||||||
@mock.patch('os.rename')
|
@mock.patch('os.rename')
|
||||||
@ -4147,6 +4163,131 @@ 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_202_reinstall_local_success(
|
||||||
|
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'
|
||||||
|
build_time = '2020-09-01 14:30:00' # 1598970600
|
||||||
|
install_time = '2020-09-01 15:30:00'
|
||||||
|
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()
|
||||||
|
for key, val in [
|
||||||
|
('name', 'test-vm'),
|
||||||
|
('epoch', '2'),
|
||||||
|
('version', '4.1'),
|
||||||
|
('release', '2020'),
|
||||||
|
('reponame', '@commandline'),
|
||||||
|
('buildtime', build_time),
|
||||||
|
('installtime', install_time),
|
||||||
|
('license', 'GPL'),
|
||||||
|
('url', 'https://qubes-os.org'),
|
||||||
|
('summary', 'Summary'),
|
||||||
|
('description', 'Desc|desc')]:
|
||||||
|
self.app.expected_calls[(
|
||||||
|
'test-vm',
|
||||||
|
'admin.vm.feature.Set',
|
||||||
|
f'template-{key}',
|
||||||
|
val.encode())] = b'0\0'
|
||||||
|
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
|
||||||
|
dl_list = {}
|
||||||
|
mock_dl_list.return_value = dl_list
|
||||||
|
mock_call.side_effect = self.add_new_vm_side_effect
|
||||||
|
mock_time = mock.Mock(wraps=datetime.datetime)
|
||||||
|
mock_time.now.return_value = \
|
||||||
|
datetime.datetime(2020, 9, 1, 15, 30, tzinfo=datetime.timezone.utc)
|
||||||
|
selector = qubesadmin.tools.qvm_template.VersionSelector.REINSTALL
|
||||||
|
with mock.patch('qubesadmin.tools.qvm_template.LOCK_FILE', '/tmp/test.lock'), \
|
||||||
|
mock.patch('datetime.datetime', new=mock_time), \
|
||||||
|
mock.patch('tempfile.TemporaryDirectory') as mock_tmpdir, \
|
||||||
|
tempfile.NamedTemporaryFile(suffix='.rpm') as template_file:
|
||||||
|
path = template_file.name
|
||||||
|
args = argparse.Namespace(
|
||||||
|
templates=[path],
|
||||||
|
keyring='/tmp/keyring.gpg',
|
||||||
|
nogpgcheck=False,
|
||||||
|
cachedir='/var/cache/qvm-template',
|
||||||
|
repo_files=[],
|
||||||
|
releasever='4.1',
|
||||||
|
yes=False,
|
||||||
|
allow_pv=False,
|
||||||
|
pool=None
|
||||||
|
)
|
||||||
|
mock_tmpdir.return_value.__enter__.return_value = \
|
||||||
|
'/var/tmp/qvm-template-tmpdir'
|
||||||
|
qubesadmin.tools.qvm_template.install(args, self.app,
|
||||||
|
version_selector=selector,
|
||||||
|
override_existing=True)
|
||||||
|
# Package is extracted
|
||||||
|
mock_extract.assert_called_with(
|
||||||
|
'test-vm',
|
||||||
|
path,
|
||||||
|
'/var/tmp/qvm-template-tmpdir')
|
||||||
|
# Package verified
|
||||||
|
self.assertEqual(mock_verify.mock_calls, [
|
||||||
|
mock.call(path, '/tmp/keyring.gpg', nogpgcheck=False)
|
||||||
|
])
|
||||||
|
# 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)
|
||||||
|
# Expect override confirmation
|
||||||
|
self.assertEqual(mock_confirm.mock_calls,
|
||||||
|
[mock.call(re_str(r'.*override changes.*:'), ['test-vm'])])
|
||||||
|
# qvm-template-postprocess is called
|
||||||
|
self.assertEqual(mock_call.mock_calls, [
|
||||||
|
mock.call([
|
||||||
|
'qvm-template-postprocess',
|
||||||
|
'--really',
|
||||||
|
'--no-installed-by-rpm',
|
||||||
|
'post-install',
|
||||||
|
'test-vm',
|
||||||
|
'/var/tmp/qvm-template-tmpdir'
|
||||||
|
'/var/lib/qubes/vm-templates/test-vm'
|
||||||
|
])
|
||||||
|
])
|
||||||
|
# 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):
|
||||||
@ -4620,3 +4761,518 @@ gpgkey = file:///etc/qubes/repo-templates/keys/RPM-GPG-KEY-qubes-$releasever-pri
|
|||||||
mock.call(args.cachedir, exist_ok=True)
|
mock.call(args.cachedir, exist_ok=True)
|
||||||
])
|
])
|
||||||
self.assertAllCalled()
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
def test_230_filter_version_latest(self):
|
||||||
|
query_res = [
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-31',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200101',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-31',
|
||||||
|
'Qubes template\n for fedora-31\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200101',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200102',
|
||||||
|
'qubes-templates-itl-testing',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200102',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
)
|
||||||
|
]
|
||||||
|
results = qubesadmin.tools.qvm_template.filter_version(
|
||||||
|
query_res,
|
||||||
|
self.app
|
||||||
|
)
|
||||||
|
self.assertEqual(sorted(results), [
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-31',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200101',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-31',
|
||||||
|
'Qubes template\n for fedora-31\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200102',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
)
|
||||||
|
])
|
||||||
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
def test_231_filter_version_reinstall(self):
|
||||||
|
query_res = [
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-31',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200101',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-31',
|
||||||
|
'Qubes template\n for fedora-31\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200102',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200101',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200102',
|
||||||
|
'qubes-templates-itl-testing',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
)
|
||||||
|
]
|
||||||
|
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
|
||||||
|
b'0\x00fedora-31 class=TemplateVM state=Halted\n' \
|
||||||
|
b'fedora-32 class=TemplateVM state=Halted\n'
|
||||||
|
for key, val in [
|
||||||
|
('name', 'fedora-31'),
|
||||||
|
('epoch', '0'),
|
||||||
|
('version', '4.1'),
|
||||||
|
('release', '20200101')]:
|
||||||
|
self.app.expected_calls[(
|
||||||
|
'fedora-31',
|
||||||
|
'admin.vm.feature.Get',
|
||||||
|
f'template-{key}',
|
||||||
|
None)] = b'0\0' + val.encode()
|
||||||
|
for key, val in [
|
||||||
|
('name', 'fedora-32'),
|
||||||
|
('epoch', '0'),
|
||||||
|
('version', '4.1'),
|
||||||
|
('release', '20200101')]:
|
||||||
|
self.app.expected_calls[(
|
||||||
|
'fedora-32',
|
||||||
|
'admin.vm.feature.Get',
|
||||||
|
f'template-{key}',
|
||||||
|
None)] = b'0\0' + val.encode()
|
||||||
|
results = qubesadmin.tools.qvm_template.filter_version(
|
||||||
|
query_res,
|
||||||
|
self.app,
|
||||||
|
qubesadmin.tools.qvm_template.VersionSelector.REINSTALL
|
||||||
|
)
|
||||||
|
self.assertEqual(sorted(results), [
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-31',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200101',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-31',
|
||||||
|
'Qubes template\n for fedora-31\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200101',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
)
|
||||||
|
])
|
||||||
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
def test_232_filter_version_upgrade(self):
|
||||||
|
query_res = [
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-31',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200101',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-31',
|
||||||
|
'Qubes template\n for fedora-31\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200102',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200101',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200102',
|
||||||
|
'qubes-templates-itl-testing',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
)
|
||||||
|
]
|
||||||
|
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
|
||||||
|
b'0\x00fedora-31 class=TemplateVM state=Halted\n' \
|
||||||
|
b'fedora-32 class=TemplateVM state=Halted\n'
|
||||||
|
for key, val in [
|
||||||
|
('name', 'fedora-31'),
|
||||||
|
('epoch', '0'),
|
||||||
|
('version', '4.1'),
|
||||||
|
('release', '20200101')]:
|
||||||
|
self.app.expected_calls[(
|
||||||
|
'fedora-31',
|
||||||
|
'admin.vm.feature.Get',
|
||||||
|
f'template-{key}',
|
||||||
|
None)] = b'0\0' + val.encode()
|
||||||
|
for key, val in [
|
||||||
|
('name', 'fedora-32'),
|
||||||
|
('epoch', '0'),
|
||||||
|
('version', '4.1'),
|
||||||
|
('release', '20200101')]:
|
||||||
|
self.app.expected_calls[(
|
||||||
|
'fedora-32',
|
||||||
|
'admin.vm.feature.Get',
|
||||||
|
f'template-{key}',
|
||||||
|
None)] = b'0\0' + val.encode()
|
||||||
|
results = qubesadmin.tools.qvm_template.filter_version(
|
||||||
|
query_res,
|
||||||
|
self.app,
|
||||||
|
qubesadmin.tools.qvm_template.VersionSelector.LATEST_HIGHER
|
||||||
|
)
|
||||||
|
self.assertEqual(sorted(results), [
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200102',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
)
|
||||||
|
])
|
||||||
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
def test_233_filter_version_downgrade(self):
|
||||||
|
query_res = [
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-31',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200101',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-31',
|
||||||
|
'Qubes template\n for fedora-31\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200102',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200101',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
),
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200102',
|
||||||
|
'qubes-templates-itl-testing',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
)
|
||||||
|
]
|
||||||
|
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
|
||||||
|
b'0\x00fedora-31 class=TemplateVM state=Halted\n' \
|
||||||
|
b'fedora-32 class=TemplateVM state=Halted\n'
|
||||||
|
for key, val in [
|
||||||
|
('name', 'fedora-31'),
|
||||||
|
('epoch', '0'),
|
||||||
|
('version', '4.1'),
|
||||||
|
('release', '20200101')]:
|
||||||
|
self.app.expected_calls[(
|
||||||
|
'fedora-31',
|
||||||
|
'admin.vm.feature.Get',
|
||||||
|
f'template-{key}',
|
||||||
|
None)] = b'0\0' + val.encode()
|
||||||
|
for key, val in [
|
||||||
|
('name', 'fedora-32'),
|
||||||
|
('epoch', '0'),
|
||||||
|
('version', '4.1'),
|
||||||
|
('release', '20200102')]:
|
||||||
|
self.app.expected_calls[(
|
||||||
|
'fedora-32',
|
||||||
|
'admin.vm.feature.Get',
|
||||||
|
f'template-{key}',
|
||||||
|
None)] = b'0\0' + val.encode()
|
||||||
|
results = qubesadmin.tools.qvm_template.filter_version(
|
||||||
|
query_res,
|
||||||
|
self.app,
|
||||||
|
qubesadmin.tools.qvm_template.VersionSelector.LATEST_LOWER
|
||||||
|
)
|
||||||
|
self.assertEqual(sorted(results), [
|
||||||
|
qubesadmin.tools.qvm_template.Template(
|
||||||
|
'fedora-32',
|
||||||
|
'0',
|
||||||
|
'4.1',
|
||||||
|
'20200101',
|
||||||
|
'qubes-templates-itl',
|
||||||
|
1048576,
|
||||||
|
datetime.datetime(2020, 1, 23, 4, 56),
|
||||||
|
'GPL',
|
||||||
|
'https://qubes-os.org',
|
||||||
|
'Qubes template for fedora-32',
|
||||||
|
'Qubes template\n for fedora-32\n'
|
||||||
|
)
|
||||||
|
])
|
||||||
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
@mock.patch('os.path.exists')
|
||||||
|
def test_240_qubes_release(self, mock_exists):
|
||||||
|
# /usr/share/qubes/marker-vm does not exist
|
||||||
|
mock_exists.return_value = False
|
||||||
|
marker_vm = '''
|
||||||
|
NAME=Qubes
|
||||||
|
VERSION="4.2 (R4.2)"
|
||||||
|
ID=qubes
|
||||||
|
# Some comments here
|
||||||
|
VERSION_ID=4.2
|
||||||
|
PRETTY_NAME="Qubes 4.2 (R4.2)"
|
||||||
|
ANSI_COLOR="0;31"
|
||||||
|
CPE_NAME="cpe:/o:ITL:qubes:4.2"
|
||||||
|
'''
|
||||||
|
with mock.patch('builtins.open', mock.mock_open(read_data=marker_vm)) \
|
||||||
|
as mock_open:
|
||||||
|
ret = qubesadmin.tools.qvm_template.qubes_release()
|
||||||
|
self.assertEqual(ret, '4.2')
|
||||||
|
self.assertEqual(mock_exists.mock_calls, [
|
||||||
|
mock.call('/usr/share/qubes/marker-vm')
|
||||||
|
])
|
||||||
|
mock_open.assert_called_with('/etc/os-release', 'r')
|
||||||
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
@mock.patch('os.path.exists')
|
||||||
|
def test_241_qubes_release_quotes(self, mock_exists):
|
||||||
|
# /usr/share/qubes/marker-vm does not exist
|
||||||
|
mock_exists.return_value = False
|
||||||
|
os_rel = '''
|
||||||
|
NAME=Qubes
|
||||||
|
VERSION="4.2 (R4.2)"
|
||||||
|
ID=qubes
|
||||||
|
# Some comments here
|
||||||
|
VERSION_ID="4.2"
|
||||||
|
PRETTY_NAME="Qubes 4.2 (R4.2)"
|
||||||
|
ANSI_COLOR="0;31"
|
||||||
|
CPE_NAME="cpe:/o:ITL:qubes:4.2"
|
||||||
|
'''
|
||||||
|
with mock.patch('builtins.open', mock.mock_open(read_data=os_rel)) \
|
||||||
|
as mock_open:
|
||||||
|
ret = qubesadmin.tools.qvm_template.qubes_release()
|
||||||
|
self.assertEqual(ret, '4.2')
|
||||||
|
self.assertEqual(mock_exists.mock_calls, [
|
||||||
|
mock.call('/usr/share/qubes/marker-vm')
|
||||||
|
])
|
||||||
|
mock_open.assert_called_with('/etc/os-release', 'r')
|
||||||
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
@mock.patch('os.path.exists')
|
||||||
|
def test_242_qubes_release_quotes(self, mock_exists):
|
||||||
|
# /usr/share/qubes/marker-vm does exist
|
||||||
|
mock_exists.return_value = True
|
||||||
|
marker_vm = '''
|
||||||
|
# This is just a marker file for Qubes OS VM.
|
||||||
|
# This VM have tools for Qubes version:
|
||||||
|
4.2
|
||||||
|
'''
|
||||||
|
with mock.patch('builtins.open', mock.mock_open(read_data=marker_vm)) \
|
||||||
|
as mock_open:
|
||||||
|
ret = qubesadmin.tools.qvm_template.qubes_release()
|
||||||
|
self.assertEqual(ret, '4.2')
|
||||||
|
self.assertEqual(mock_exists.mock_calls, [
|
||||||
|
mock.call('/usr/share/qubes/marker-vm')
|
||||||
|
])
|
||||||
|
mock_open.assert_called_with('/usr/share/qubes/marker-vm', 'r')
|
||||||
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
def test_250_qrexec_download_success(self):
|
||||||
|
rand_bytes = os.urandom(128)
|
||||||
|
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
|
||||||
|
b'0\x00test-vm class=TemplateVM state=Halted\n'
|
||||||
|
self.app.expected_service_calls[
|
||||||
|
('test-vm', 'qubes.TemplateDownload')] = rand_bytes
|
||||||
|
args = argparse.Namespace(
|
||||||
|
repo_files=[],
|
||||||
|
releasever='4.1',
|
||||||
|
updatevm='test-vm',
|
||||||
|
enablerepo=[],
|
||||||
|
disablerepo=[],
|
||||||
|
repoid=[],
|
||||||
|
quiet=True
|
||||||
|
)
|
||||||
|
with tempfile.NamedTemporaryFile() as fd:
|
||||||
|
qubesadmin.tools.qvm_template.qrexec_download(
|
||||||
|
args, self.app, 'fedora-31:4.0', path=fd.name)
|
||||||
|
with open(fd.name, 'rb') as fd2:
|
||||||
|
result = fd2.read()
|
||||||
|
self.assertEqual(rand_bytes, result)
|
||||||
|
self.assertAllCalled()
|
||||||
|
|
||||||
|
def test_251_qrexec_download_fail(self):
|
||||||
|
rand_bytes = os.urandom(128)
|
||||||
|
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
|
||||||
|
b'0\x00test-vm class=TemplateVM state=Halted\n'
|
||||||
|
self.app.expected_service_calls[
|
||||||
|
('test-vm', 'qubes.TemplateDownload')] = rand_bytes
|
||||||
|
args = argparse.Namespace(
|
||||||
|
repo_files=[],
|
||||||
|
releasever='4.1',
|
||||||
|
updatevm='test-vm',
|
||||||
|
enablerepo=[],
|
||||||
|
disablerepo=[],
|
||||||
|
repoid=[],
|
||||||
|
quiet=True
|
||||||
|
)
|
||||||
|
with tempfile.NamedTemporaryFile() as fd, \
|
||||||
|
mock.patch('qubesadmin.tests.TestProcess.wait') as mock_wait:
|
||||||
|
mock_wait.return_value = 1
|
||||||
|
with self.assertRaises(ConnectionError):
|
||||||
|
qubesadmin.tools.qvm_template.qrexec_download(
|
||||||
|
args, self.app, 'fedora-31:4.0', path=fd.name)
|
||||||
|
self.assertAllCalled()
|
||||||
|
Loading…
Reference in New Issue
Block a user