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

Proposed by Newell Jensen
Status: Merged
Approved by: Newell Jensen
Approved revision: 4e40628eb9ed6d55628716c212d6e63f636b6421
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~newell-jensen/maas:lp1761584
Merge into: maas:master
Diff against target: 94 lines (+49/-2)
2 files modified
src/provisioningserver/drivers/pod/tests/test_virsh.py (+30/-2)
src/provisioningserver/drivers/pod/virsh.py (+19/-0)
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
MAAS Lander Approve
Andres Rodriguez Pending
Review via email: mp+342908@code.launchpad.net

Commit message

LP: #1761584 -- Create default storage pool 'maas' for virsh pods if no default storage pool is present.

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

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

STATUS: SUCCESS
COMMIT: 4e40628eb9ed6d55628716c212d6e63f636b6421

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 467574a..e7925a0 100644
3--- a/src/provisioningserver/drivers/pod/tests/test_virsh.py
4+++ b/src/provisioningserver/drivers/pod/tests/test_virsh.py
5@@ -431,6 +431,31 @@ class TestVirshSSH(MAASTestCase):
6 value = conn.get_key_value(SAMPLE_NODEINFO, key)
7 self.assertEquals(value, expected)
8
9+ def test_create_storage_pool(self):
10+ mock_run = self.patch(virsh.VirshSSH, 'run')
11+ mock_run.return_value = ''
12+ conn = virsh.VirshSSH()
13+ conn.create_storage_pool()
14+ self.assertThat(mock_run, MockCallsMatch(
15+ call(['pool-define-as', 'maas', 'dir',
16+ '- - - -', '/var/lib/libvirt/maas-images']),
17+ call(['pool-build', 'maas']),
18+ call(['pool-start', 'maas']),
19+ call(['pool-autostart', 'maas'])))
20+
21+ def test_create_storage_pool_writes_maaslog_on_error(self):
22+ mock_maaslog = self.patch(virsh, 'maaslog')
23+ mock_run = self.patch(virsh.VirshSSH, 'run')
24+ error_msg = 'error: error message here'
25+ mock_run.return_value = error_msg
26+ conn = virsh.VirshSSH()
27+ conn.create_storage_pool()
28+ self.assertThat(mock_run, MockCalledOnceWith(
29+ ['pool-define-as', 'maas', 'dir',
30+ '- - - -', '/var/lib/libvirt/maas-images']))
31+ self.assertThat(mock_maaslog.error, MockCalledOnceWith(
32+ "Failed to create Pod storage pool: %s", error_msg))
33+
34 def test_list_machines(self):
35 names = [factory.make_name('machine') for _ in range(3)]
36 conn = self.configure_virshssh('\n'.join(names))
37@@ -1472,8 +1497,10 @@ class TestVirshPodDriver(MAASTestCase):
38 ]
39 mock_login = self.patch(virsh.VirshSSH, 'login')
40 mock_login.return_value = True
41- mock_run = self.patch(virsh.VirshSSH, 'run')
42- mock_run.return_value = SAMPLE_POOLLIST
43+ mock_list_pools = self.patch(virsh.VirshSSH, 'list_pools')
44+ mock_list_pools.side_effect = ([], ['default'], ['default'])
45+ mock_create_storage_pool = self.patch(
46+ virsh.VirshSSH, 'create_storage_pool')
47 mock_get_pod_resources = self.patch(
48 virsh.VirshSSH, 'get_pod_resources')
49 mock_get_pod_hints = self.patch(
50@@ -1484,6 +1511,7 @@ class TestVirshPodDriver(MAASTestCase):
51 mock_list_machines.return_value = machines
52
53 discovered_pod = yield driver.discover(system_id, context)
54+ self.expectThat(mock_create_storage_pool, MockCalledOnceWith())
55 self.expectThat(
56 mock_get_pod_resources, MockCalledOnceWith())
57 self.expectThat(
58diff --git a/src/provisioningserver/drivers/pod/virsh.py b/src/provisioningserver/drivers/pod/virsh.py
59index 30a4955..537de91 100644
60--- a/src/provisioningserver/drivers/pod/virsh.py
61+++ b/src/provisioningserver/drivers/pod/virsh.py
62@@ -289,6 +289,20 @@ class VirshSSH(pexpect.spawn):
63 if value:
64 return value.split()[0]
65
66+ def create_storage_pool(self):
67+ """Create a storage pool named `maas`."""
68+ commands = [
69+ ['pool-define-as', 'maas', 'dir',
70+ '- - - -', '/var/lib/libvirt/maas-images'],
71+ ['pool-build', 'maas'],
72+ ['pool-start', 'maas'],
73+ ['pool-autostart', 'maas']]
74+ for command in commands:
75+ output = self.run(command)
76+ if output.startswith('error:'):
77+ maaslog.error("Failed to create Pod storage pool: %s", output)
78+ return None
79+
80 def list_machines(self):
81 """Lists all VMs by name."""
82 machines = self.run(['list', '--all', '--name'])
83@@ -928,6 +942,11 @@ class VirshPodDriver(PodDriver):
84 """
85 conn = yield self.get_virsh_connection(context)
86
87+ # Check that we have at least one storage pool. If not, create it.
88+ pools = yield deferToThread(conn.list_pools)
89+ if not len(pools):
90+ yield deferToThread(conn.create_storage_pool)
91+
92 # Check and set default storage pool.
93 self.default_storage_pool = context.get('default_storage_pool')
94 if self.default_storage_pool:

Subscribers

People subscribed via source and target branches