Merge ~newell-jensen/maas:2.5-lp1819018 into maas:2.5

Proposed by Newell Jensen
Status: Merged
Approved by: Newell Jensen
Approved revision: 014a022f42d6db117a78af131ba5ada1cc629189
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~newell-jensen/maas:2.5-lp1819018
Merge into: maas:2.5
Diff against target: 144 lines (+114/-3)
2 files modified
src/provisioningserver/drivers/pod/tests/test_virsh.py (+111/-0)
src/provisioningserver/drivers/pod/virsh.py (+3/-3)
Reviewer Review Type Date Requested Status
Newell Jensen (community) Approve
Review via email: mp+364351@code.launchpad.net

Commit message

backport of 702ca086107ae7a5693b20830c25e1ac8ba77eab

LP: #1819018 -- Handle the case when we are unable to find a Virsh storage pool while discovering a new Pod.

To post a comment you must log in.
Revision history for this message
Newell Jensen (newell-jensen) wrote :

self approved backport

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/tests/test_virsh.py b/src/provisioningserver/drivers/pod/tests/test_virsh.py
2index 3cf64ea..0d39651 100644
3--- a/src/provisioningserver/drivers/pod/tests/test_virsh.py
4+++ b/src/provisioningserver/drivers/pod/tests/test_virsh.py
5@@ -1000,6 +1000,117 @@ class TestVirshSSH(MAASTestCase):
6 self.assertFalse(discovered_machine.interfaces[1].boot)
7 self.assertFalse(discovered_machine.interfaces[2].boot)
8
9+ def test__get_discovered_machine_handles_no_storage_pools_found(self):
10+ conn = self.configure_virshssh('')
11+ hostname = factory.make_name('hostname')
12+ architecture = factory.make_name('arch')
13+ cores = random.randint(1, 8)
14+ memory = random.randint(4096, 8192)
15+
16+ # Storage pool names and pools are only for setting the devices.
17+ # Further down we will be setting the return value for
18+ # find_storage_pool to None which happens if a storage pool
19+ # cannot be found for a specific block device.
20+ storage_pool_names = [
21+ factory.make_name('storage')
22+ for _ in range(3)
23+ ]
24+ storage_pools = [
25+ DiscoveredPodStoragePool(
26+ id=factory.make_name('uuid'),
27+ type='dir',
28+ name=name,
29+ storage=random.randint(4096, 8192),
30+ path='/var/lib/libvirt/%s/' % name)
31+ for name in storage_pool_names
32+ ]
33+ device_names = [
34+ factory.make_name('device')
35+ for _ in range(3)
36+ ]
37+ devices = []
38+ for name in device_names:
39+ pool = random.choice(storage_pools)
40+ name = factory.make_name('device')
41+ devices.append((
42+ name,
43+ pool.path + '/' + name))
44+ device_tags = [
45+ [
46+ factory.make_name('tag')
47+ for _ in range(3)
48+ ]
49+ for _ in range(3)
50+ ]
51+ local_storage = [
52+ random.randint(4096, 8192) for _ in range(3)
53+ ]
54+ mac_addresses = [
55+ factory.make_mac_address() for _ in range(3)
56+ ]
57+ mock_get_pod_storage_pools = self.patch(
58+ virsh.VirshSSH, 'get_pod_storage_pools')
59+ mock_find_storage_pool = self.patch(
60+ virsh.VirshSSH, 'find_storage_pool')
61+ mock_get_machine_arch = self.patch(
62+ virsh.VirshSSH, 'get_machine_arch')
63+ mock_get_machine_cpu_count = self.patch(
64+ virsh.VirshSSH, 'get_machine_cpu_count')
65+ mock_get_machine_memory = self.patch(
66+ virsh.VirshSSH, 'get_machine_memory')
67+ mock_get_machine_state = self.patch(
68+ virsh.VirshSSH, 'get_machine_state')
69+ mock_list_machine_block_devices = self.patch(
70+ virsh.VirshSSH, 'list_machine_block_devices')
71+ mock_get_machine_local_storage = self.patch(
72+ virsh.VirshSSH, 'get_machine_local_storage')
73+ mock_get_machine_interface_info = self.patch(
74+ virsh.VirshSSH, 'get_machine_interface_info')
75+ mock_get_pod_storage_pools.return_value = storage_pools
76+ mock_find_storage_pool.return_value = None
77+ mock_get_machine_arch.return_value = architecture
78+ mock_get_machine_cpu_count.return_value = cores
79+ mock_get_machine_memory.return_value = memory
80+ mock_get_machine_state.return_value = "shut off"
81+ mock_list_machine_block_devices.return_value = devices
82+ mock_get_machine_local_storage.side_effect = local_storage
83+ mock_get_machine_interface_info.return_value = [
84+ InterfaceInfo('bridge', 'br0', 'virtio', mac)
85+ for mac in mac_addresses
86+ ]
87+
88+ block_devices = [
89+ RequestedMachineBlockDevice(
90+ size=local_storage[idx], tags=device_tags[idx])
91+ for idx in range(3)
92+ ]
93+ # None of the parameters matter in the RequestedMachine except for
94+ # block_device. All other paramters are ignored by this method.
95+ request = RequestedMachine(
96+ hostname=None, architecture='', cores=0, memory=0, interfaces=[],
97+ block_devices=block_devices)
98+ discovered_machine = conn.get_discovered_machine(
99+ hostname, request=request)
100+ self.assertEquals(hostname, discovered_machine.hostname)
101+ self.assertEquals(architecture, discovered_machine.architecture)
102+ self.assertEquals(cores, discovered_machine.cores)
103+ self.assertEquals(memory, discovered_machine.memory)
104+ self.assertIsNone(discovered_machine.block_devices[0].storage_pool)
105+ self.assertIsNone(discovered_machine.block_devices[1].storage_pool)
106+ self.assertIsNone(discovered_machine.block_devices[2].storage_pool)
107+ self.assertItemsEqual(
108+ local_storage,
109+ [bd.size for bd in discovered_machine.block_devices])
110+ self.assertItemsEqual(
111+ device_tags,
112+ [bd.tags for bd in discovered_machine.block_devices])
113+ self.assertItemsEqual(
114+ mac_addresses,
115+ [m.mac_address for m in discovered_machine.interfaces])
116+ self.assertTrue(discovered_machine.interfaces[0].boot)
117+ self.assertFalse(discovered_machine.interfaces[1].boot)
118+ self.assertFalse(discovered_machine.interfaces[2].boot)
119+
120 def test__get_discovered_machine_handles_bad_storage_device(self):
121 conn = self.configure_virshssh('')
122 hostname = factory.make_name('hostname')
123diff --git a/src/provisioningserver/drivers/pod/virsh.py b/src/provisioningserver/drivers/pod/virsh.py
124index f6594bc..82ecda8 100644
125--- a/src/provisioningserver/drivers/pod/virsh.py
126+++ b/src/provisioningserver/drivers/pod/virsh.py
127@@ -722,14 +722,14 @@ class VirshSSH(pexpect.spawn):
128 machine, device))
129 return None
130
131- # Find the storage pool for this block device. Virsh doesn't
132- # tell you this information.
133+ # Find the storage pool for this block device if it belongs to
134+ # a storage pool. Virsh doesn't tell you this information.
135 storage_pool = self.find_storage_pool(source, storage_pools)
136 block_devices.append(
137 DiscoveredMachineBlockDevice(
138 model=None, serial=None, size=size,
139 id_path="/dev/%s" % device, tags=tags,
140- storage_pool=storage_pool.id))
141+ storage_pool=storage_pool.id if storage_pool else None))
142 discovered_machine.block_devices = block_devices
143
144 # Discover interfaces.

Subscribers

People subscribed via source and target branches