Merge ~alexsander-souza/maas:lp1943444_fix_lxd_boot_order into maas:master

Proposed by Alexsander de Souza
Status: Merged
Approved by: Alexsander de Souza
Approved revision: 9f5b0d345fda64e5742d94d536d347b72812be3c
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~alexsander-souza/maas:lp1943444_fix_lxd_boot_order
Merge into: maas:master
Diff against target: 119 lines (+59/-12)
2 files modified
src/provisioningserver/drivers/pod/lxd.py (+10/-4)
src/provisioningserver/drivers/pod/tests/test_lxd.py (+49/-8)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Alberto Donato (community) Approve
Review via email: mp+409242@code.launchpad.net

Commit message

Preserve request's device order

Whenever is possible preserve the original device order from the request.

Fixes LP#1943444

Description of the change

The disk with the path set to root ('/') is always reported last by LXD, while MAAS expects that the order in the request is preserved.

This patch fixes this by building the discovered devices list in the original order, as currently there's no way to change the order LXD reports the devices (devices are sorted by path, the default storage must have the path set to root while the others must not have a path defined)

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b lp1943444_fix_lxd_boot_order lp:~alexsander-souza/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: d2941a0d402e583094274301dc6af368dd30dc01

review: Approve
Revision history for this message
Alberto Donato (ack) wrote :

Can't you just use the device name in the config rather than indexes?
AFAIK LXD requires the first disk to be called "root".

Also, please add at least one test for the change

review: Needs Information
Revision history for this message
Alexsander de Souza (alexsander-souza) wrote :

> Can't you just use the device name in the config rather than indexes?
The existing code uses indexes, so I just followed it. I'll check if more robust approach is possible.

> AFAIK LXD requires the first disk to be called "root".
No, LXD doesn't care about the labels. The root disk is identified by `path = /`.

>
> Also, please add at least one test for the change
Will do

Revision history for this message
Alexsander de Souza (alexsander-souza) wrote :

The request doesn't have the device names, so we can only match by index

Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b lp1943444_fix_lxd_boot_order lp:~alexsander-souza/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 460c45e75beaddd625bdfc45942809c8fc2cae2c

review: Approve
Revision history for this message
Alberto Donato (ack) wrote :

+1

one minor nit inline

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b lp1943444_fix_lxd_boot_order lp:~alexsander-souza/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/11125/console
COMMIT: 04efcb54749d32f8c981ca295342009249aea96d

review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b lp1943444_fix_lxd_boot_order lp:~alexsander-souza/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 61f5a129bf72849792e212796f55c0ef63a7124c

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
Alexsander de Souza (alexsander-souza) wrote :

jenkins: !test

Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b lp1943444_fix_lxd_boot_order lp:~alexsander-souza/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/11131/console
COMMIT: 61f5a129bf72849792e212796f55c0ef63a7124c

review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b lp1943444_fix_lxd_boot_order lp:~alexsander-souza/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 9f5b0d345fda64e5742d94d536d347b72812be3c

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
Alexsander de Souza (alexsander-souza) wrote :

jenkins: !test

Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b lp1943444_fix_lxd_boot_order lp:~alexsander-souza/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 9f5b0d345fda64e5742d94d536d347b72812be3c

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/provisioningserver/drivers/pod/lxd.py b/src/provisioningserver/drivers/pod/lxd.py
2index 9261931..0b54702 100644
3--- a/src/provisioningserver/drivers/pod/lxd.py
4+++ b/src/provisioningserver/drivers/pod/lxd.py
5@@ -731,6 +731,7 @@ class LXDPodDriver(PodDriver):
6 for name, device in machine.expanded_devices.items():
7 if device["type"] == "disk":
8 requested_device = None
9+ index = -1
10 if request:
11 # for composed VMs, the root disk is always the first
12 # one. Adjust the index so that it matches the requested
13@@ -741,11 +742,16 @@ class LXDPodDriver(PodDriver):
14 extra_block_devices += 1
15 index = extra_block_devices
16 requested_device = request.block_devices[index]
17- block_devices.append(
18- _get_discovered_block_device(
19- name, device, requested_device=requested_device
20- )
21+
22+ blkdev = _get_discovered_block_device(
23+ name, device, requested_device=requested_device
24 )
25+
26+ if index >= 0:
27+ block_devices.insert(index, blkdev)
28+ else:
29+ block_devices.append(blkdev)
30+
31 elif device["type"] == "nic":
32 interfaces.append(
33 _get_discovered_interface(name, device, not interfaces)
34diff --git a/src/provisioningserver/drivers/pod/tests/test_lxd.py b/src/provisioningserver/drivers/pod/tests/test_lxd.py
35index 05e8397..a337955 100644
36--- a/src/provisioningserver/drivers/pod/tests/test_lxd.py
37+++ b/src/provisioningserver/drivers/pod/tests/test_lxd.py
38@@ -1391,24 +1391,55 @@ class TestLXDPodDriver(MAASTestCase):
39 pod_id = factory.make_name("pod_id")
40 request = make_requested_machine(num_disks=2)
41 self.fake_lxd.profiles.exists.return_value = False
42- mock_storage_pools = Mock()
43- self.fake_lxd.storage_pools.all.return_value = mock_storage_pools
44+
45 mock_get_usable_storage_pool = self.patch(
46 self.driver, "_get_usable_storage_pool"
47 )
48 # a volume is created for the second disk
49 volume = Mock()
50+ volume.config = {
51+ "size": str(request.block_devices[1].size),
52+ }
53 volume.name = factory.make_name("vol")
54 usable_pool = Mock()
55 usable_pool.name = factory.make_name("pool")
56 usable_pool.volumes.create.return_value = volume
57+ usable_pool.volumes.get.return_value = volume
58 mock_get_usable_storage_pool.return_value = usable_pool
59- mock_machine = Mock()
60- self.fake_lxd.virtual_machines.create.return_value = mock_machine
61- mock_get_discovered_machine = self.patch(
62- self.driver, "_get_discovered_machine"
63+ self.fake_lxd.storage_pools.get.return_value = usable_pool
64+
65+ # LXD sorts the devices in a way the root dist is always last
66+ expanded_devices = {
67+ "disk1": {
68+ "path": "",
69+ "pool": usable_pool.name,
70+ "source": volume.name,
71+ "type": "disk",
72+ },
73+ "eth0": {
74+ "boot.priority": "1",
75+ "name": "eth0",
76+ "nictype": "bridged",
77+ "parent": "maas-kvm",
78+ "type": "nic",
79+ },
80+ "root": {
81+ "path": "/",
82+ "pool": usable_pool.name,
83+ "size": str(request.block_devices[0].size),
84+ "type": "disk",
85+ "boot.priority": 0,
86+ },
87+ }
88+ mock_machine = Mock(
89+ name=factory.make_name(),
90+ architecture=debian_to_kernel_architecture(request.architecture),
91+ expanded_devices=expanded_devices,
92+ expanded_config={},
93+ status_code=101,
94 )
95- mock_get_discovered_machine.return_value = sentinel.discovered_machine
96+ self.fake_lxd.virtual_machines.create.return_value = mock_machine
97+
98 definition = {
99 "name": request.hostname,
100 "architecture": debian_to_kernel_architecture(
101@@ -1452,7 +1483,17 @@ class TestLXDPodDriver(MAASTestCase):
102 self.fake_lxd.virtual_machines.create.assert_called_once_with(
103 definition, wait=True
104 )
105- self.assertEqual(sentinel.discovered_machine, discovered_machine)
106+
107+ # assert the device order was preserved
108+ self.assertEqual(
109+ request.block_devices[0].size,
110+ discovered_machine.block_devices[0].size,
111+ )
112+ self.assertEqual(
113+ request.block_devices[1].size,
114+ discovered_machine.block_devices[1].size,
115+ )
116+
117 # a volume for the additional disk is created
118 usable_pool.volumes.create.assert_called_with(
119 "custom",

Subscribers

People subscribed via source and target branches