filesystem: api tests for v2 guided

This commit is contained in:
Dan Bungert 2022-07-06 13:28:01 -06:00
parent 4c4506ac37
commit b895fba66a
1 changed files with 135 additions and 3 deletions

View File

@ -1,3 +1,18 @@
# Copyright 2021 Canonical, Ltd.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import aiohttp
from aiohttp.client_exceptions import ClientResponseError
import async_timeout
@ -26,9 +41,12 @@ def first(items, key, value):
return next(find(items, key, value))
def match(items, **kwargs):
def match(items, **kw):
typename = kw.pop('_type', None)
if typename is not None:
kw['$type'] = typename
return [item for item in items
if all(item.get(k) == v for k, v in kwargs.items())]
if all(item.get(k) == v for k, v in kw.items())]
def timeout(multiplier=1):
@ -340,13 +358,127 @@ class TestFlow(TestAPI):
class TestGuided(TestAPI):
@timeout()
async def test_guided_v2(self):
async def test_deprecated_guided_v2(self):
async with start_server('examples/simple.json') as inst:
choice = {'disk_id': 'disk-sda'}
resp = await inst.post('/storage/v2/deprecated/guided', choice)
self.assertEqual(1, len(resp['disks']))
self.assertEqual('disk-sda', resp['disks'][0]['id'])
@timeout()
async def test_guided_v2_reformat(self):
cfg = 'examples/win10-along-ubuntu.json'
extra = ['--storage-version', '2']
async with start_server(cfg, extra_args=extra) as inst:
resp = await inst.get('/storage/v2/guided')
[reformat] = match(resp['possible'],
_type='GuidedStorageTargetReformat')
data = {'target': reformat}
resp = await inst.post('/storage/v2/guided', data)
self.assertEqual(reformat, resp['configured']['target'])
resp = await inst.get('/storage/v2')
[p1, p2] = resp['disks'][0]['partitions']
expected_p1 = {
'$type': 'Partition',
'boot': True,
'format': 'fat32',
'grub_device': True,
'mount': '/boot/efi',
'number': 1,
'wipe': 'superblock',
}
self.assertDictSubset(expected_p1, p1)
expected_p2 = {
'number': 2,
'mount': '/',
'format': 'ext4',
'wipe': 'superblock',
}
self.assertDictSubset(expected_p2, p2)
@timeout()
async def test_guided_v2_resize(self):
cfg = 'examples/win10-along-ubuntu.json'
extra = ['--storage-version', '2']
async with start_server(cfg, extra_args=extra) as inst:
orig_resp = await inst.get('/storage/v2')
[orig_p1, orig_p2, orig_p3, orig_p4, orig_p5] = \
orig_resp['disks'][0]['partitions']
resp = await inst.get('/storage/v2/guided')
[resize_ntfs, resize_ext4] = match(
resp['possible'], _type='GuidedStorageTargetResize')
resize_ntfs['new_size'] = 30 << 30
data = {'target': resize_ntfs}
resp = await inst.post('/storage/v2/guided', data)
self.assertEqual(resize_ntfs, resp['configured']['target'])
resp = await inst.get('/storage/v2')
[p1, p2, p3, p6, p4, p5] = resp['disks'][0]['partitions']
expected_p1 = {
'$type': 'Partition',
'boot': True,
'format': 'vfat',
'grub_device': True,
'mount': '/boot/efi',
'number': 1,
'size': orig_p1['size'],
'resize': None,
'wipe': None,
}
self.assertDictSubset(expected_p1, p1)
self.assertEqual(orig_p2, p2)
self.assertEqual(orig_p4, p4)
self.assertEqual(orig_p5, p5)
expected_p6 = {
'number': 6,
'mount': '/',
'format': 'ext4',
}
self.assertDictSubset(expected_p6, p6)
@timeout()
async def test_guided_v2_use_gap(self):
cfg = self.machineConfig('examples/win10-along-ubuntu.json')
with cfg.edit() as data:
pt = data['storage']['blockdev']['/dev/sda']['partitiontable']
[node] = match(pt['partitions'], node='/dev/sda5')
pt['partitions'].remove(node)
del data['storage']['blockdev']['/dev/sda5']
del data['storage']['filesystem']['/dev/sda5']
extra = ['--storage-version', '2']
async with start_server(cfg, extra_args=extra) as inst:
orig_resp = await inst.get('/storage/v2')
[orig_p1, orig_p2, orig_p3, orig_p4, gap] = \
orig_resp['disks'][0]['partitions']
resp = await inst.get('/storage/v2/guided')
[use_gap] = match(resp['possible'],
_type='GuidedStorageTargetUseGap')
data = {'target': use_gap}
resp = await inst.post('/storage/v2/guided', data)
self.assertEqual(use_gap, resp['configured']['target'])
resp = await inst.get('/storage/v2')
[p1, p2, p3, p4, p5] = resp['disks'][0]['partitions']
expected_p1 = {
'$type': 'Partition',
'boot': True,
'format': 'vfat',
'grub_device': True,
'mount': '/boot/efi',
'number': 1,
'size': orig_p1['size'],
'resize': None,
'wipe': None,
}
self.assertDictSubset(expected_p1, p1)
self.assertEqual(orig_p2, p2)
self.assertEqual(orig_p3, p3)
self.assertEqual(orig_p4, p4)
expected_p5 = {
'number': 5,
'mount': '/',
'format': 'ext4',
}
self.assertDictSubset(expected_p5, p5)
class TestAdd(TestAPI):
@timeout()