Merge ~newell-jensen/maas:lp1800483 into maas:master

Proposed by Newell Jensen
Status: Merged
Approved by: Newell Jensen
Approved revision: ba48cee423bc0e43087c10c46c3188fe1aa45f9f
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~newell-jensen/maas:lp1800483
Merge into: maas:master
Diff against target: 145 lines (+36/-14)
2 files modified
src/provisioningserver/drivers/pod/tests/test_virsh.py (+22/-6)
src/provisioningserver/drivers/pod/virsh.py (+14/-8)
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
MAAS Lander Approve
Review via email: mp+357981@code.launchpad.net

Commit message

LP: #1800483 -- Do not use thin provisioning for LVM storage pools in virsh.

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

UNIT TESTS
-b lp1800483 lp:~newell-jensen/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: ba48cee423bc0e43087c10c46c3188fe1aa45f9f

review: Approve
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Looks good.

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 502ec3d..0c9498a 100644
3--- a/src/provisioningserver/drivers/pod/tests/test_virsh.py
4+++ b/src/provisioningserver/drivers/pod/tests/test_virsh.py
5@@ -1140,7 +1140,7 @@ class TestVirshSSH(MAASTestCase):
6 self.patch(
7 virsh.VirshSSH, "get_pod_storage_pools").return_value = pools
8 self.assertEqual(
9- pools[1].name,
10+ (pools[1].type, pools[1].name),
11 conn.get_usable_pool(disk))
12
13 def test_get_usable_pool_filters_on_disk_tags(self):
14@@ -1160,7 +1160,7 @@ class TestVirshSSH(MAASTestCase):
15 self.patch(
16 virsh.VirshSSH, "get_pod_storage_pools").return_value = pools
17 self.assertEqual(
18- selected_pool.name,
19+ (selected_pool.type, selected_pool.name),
20 conn.get_usable_pool(disk))
21
22 def test_get_usable_pool_filters_on_disk_tags_raises_invalid(self):
23@@ -1199,7 +1199,7 @@ class TestVirshSSH(MAASTestCase):
24 self.patch(
25 virsh.VirshSSH, "get_pod_storage_pools").return_value = pools
26 self.assertEqual(
27- selected_pool.name,
28+ (selected_pool.type, selected_pool.name),
29 conn.get_usable_pool(disk, selected_pool.id))
30
31 def test_get_usable_pool_filters_on_default_pool_id_raises_invalid(self):
32@@ -1238,7 +1238,7 @@ class TestVirshSSH(MAASTestCase):
33 self.patch(
34 virsh.VirshSSH, "get_pod_storage_pools").return_value = pools
35 self.assertEqual(
36- selected_pool.name,
37+ (selected_pool.type, selected_pool.name),
38 conn.get_usable_pool(disk, selected_pool.name))
39
40 def test_get_usable_pool_filters_on_default_pool_name_raises_invalid(self):
41@@ -1264,7 +1264,7 @@ class TestVirshSSH(MAASTestCase):
42 def test_create_local_volume_returns_None(self):
43 conn = self.configure_virshssh('')
44 self.patch(
45- virsh.VirshSSH, "get_usable_pool").return_value = None
46+ virsh.VirshSSH, "get_usable_pool").return_value = (None, None)
47 self.assertIsNone(conn.create_local_volume(random.randint(1000, 2000)))
48
49 def test_create_local_volume_returns_tagged_pool_and_volume(self):
50@@ -1281,8 +1281,9 @@ class TestVirshSSH(MAASTestCase):
51 def test_create_local_volume_makes_call_returns_pool_and_volume(self):
52 conn = self.configure_virshssh('')
53 pool = factory.make_name('pool')
54+ pool_type = factory.make_name('pool_type')
55 self.patch(
56- virsh.VirshSSH, "get_usable_pool").return_value = pool
57+ virsh.VirshSSH, "get_usable_pool").return_value = (pool_type, pool)
58 mock_run = self.patch(virsh.VirshSSH, "run")
59 disk = RequestedMachineBlockDevice(
60 size=random.randint(1000, 2000), tags=[])
61@@ -1293,6 +1294,21 @@ class TestVirshSSH(MAASTestCase):
62 self.assertEqual(pool, used_pool)
63 self.assertIsNotNone(volume_name)
64
65+ def test_create_local_volume_makes_call_returns_pool_and_volume_lvm(self):
66+ conn = self.configure_virshssh('')
67+ pool = factory.make_name('pool')
68+ self.patch(
69+ virsh.VirshSSH, "get_usable_pool").return_value = ('logical', pool)
70+ mock_run = self.patch(virsh.VirshSSH, "run")
71+ disk = RequestedMachineBlockDevice(
72+ size=random.randint(1000, 2000), tags=[])
73+ used_pool, volume_name = conn.create_local_volume(disk)
74+ self.assertThat(mock_run, MockCalledOnceWith([
75+ 'vol-create-as', used_pool, volume_name, str(disk.size),
76+ '--format', 'raw']))
77+ self.assertEqual(pool, used_pool)
78+ self.assertIsNotNone(volume_name)
79+
80 def test_delete_local_volume(self):
81 conn = self.configure_virshssh('')
82 pool = factory.make_name('pool')
83diff --git a/src/provisioningserver/drivers/pod/virsh.py b/src/provisioningserver/drivers/pod/virsh.py
84index 69629d7..bc947c5 100644
85--- a/src/provisioningserver/drivers/pod/virsh.py
86+++ b/src/provisioningserver/drivers/pod/virsh.py
87@@ -818,7 +818,7 @@ class VirshSSH(pexpect.spawn):
88 return True
89
90 def get_usable_pool(self, disk, default_pool=None):
91- """Return the pool that has enough space for `disk.size`."""
92+ """Return the pool and type that has enough space for `disk.size`."""
93 pools = self.get_pod_storage_pools(with_available=True)
94 filtered_pools = [
95 pool
96@@ -828,7 +828,7 @@ class VirshSSH(pexpect.spawn):
97 if filtered_pools:
98 for pool in filtered_pools:
99 if disk.size <= pool.available:
100- return pool.name
101+ return pool.type, pool.name
102 raise PodInvalidResources(
103 "Not enough storage space on storage pools: %s" % (
104 ', '.join([pool.name for pool in filtered_pools])))
105@@ -847,7 +847,7 @@ class VirshSSH(pexpect.spawn):
106 if filtered_pools:
107 default_pool = filtered_pools[0]
108 if disk.size <= default_pool.available:
109- return default_pool.name
110+ return default_pool.type, default_pool.name
111 raise PodInvalidResources(
112 "Not enough space in default storage pool: %s" % (
113 default_pool.name))
114@@ -855,20 +855,26 @@ class VirshSSH(pexpect.spawn):
115 "Default storage pool '%s' doesn't exist." % default_pool)
116 for pool in pools:
117 if disk.size <= pool.available:
118- return pool.name
119+ return pool.type, pool.name
120 raise PodInvalidResources(
121 "Not enough storage space on any storage pools: %s" % (
122 ', '.join([pool.name for pool in pools])))
123
124 def create_local_volume(self, disk, default_pool=None):
125 """Create a local volume with `disk.size`."""
126- usable_pool = self.get_usable_pool(disk, default_pool)
127+ usable_pool_type, usable_pool = self.get_usable_pool(
128+ disk, default_pool)
129 if usable_pool is None:
130 return None
131 volume = str(uuid4())
132- self.run([
133- 'vol-create-as', usable_pool, volume, str(disk.size),
134- '--allocation', '0', '--format', 'raw'])
135+ if usable_pool_type == 'logical':
136+ self.run([
137+ 'vol-create-as', usable_pool, volume, str(disk.size),
138+ '--format', 'raw'])
139+ else:
140+ self.run([
141+ 'vol-create-as', usable_pool, volume, str(disk.size),
142+ '--allocation', '0', '--format', 'raw'])
143 return usable_pool, volume
144
145 def delete_local_volume(self, pool, volume):

Subscribers

People subscribed via source and target branches