Merge ~andreserl/maas:lp1714273 into maas:master

Proposed by Andres Rodriguez
Status: Merged
Approved by: Andres Rodriguez
Approved revision: f2ea6e02d25a80d00c01662064e41df6c9c6ac0e
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~andreserl/maas:lp1714273
Merge into: maas:master
Diff against target: 175 lines (+20/-30)
7 files modified
src/maasserver/models/node.py (+0/-9)
src/provisioningserver/drivers/power/fence_cdu.py (+2/-2)
src/provisioningserver/drivers/power/ipmi.py (+3/-4)
src/provisioningserver/drivers/power/moonshot.py (+3/-3)
src/provisioningserver/drivers/power/tests/test_fence_cdu.py (+9/-9)
src/provisioningserver/drivers/power/tests/test_ipmi.py (+2/-2)
src/provisioningserver/drivers/power/tests/test_moonshot.py (+1/-1)
Reviewer Review Type Date Requested Status
Newell Jensen (community) Approve
MAAS Maintainers Pending
Review via email: mp+330049@code.launchpad.net

Commit message

LP: #1714273 - Fix power management inside the Snap

Do not set defaults for power driver binaries, as each power driver should know what binary they use. This fixes power management inside the snap, allowing it to access the binary without hardcoding a path.

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

Needs unit tests (at least some modifications). One inline comment below.

What you have looks good otherwise.

review: Needs Fixing
~andreserl/maas:lp1714273 updated
3f06f2c... by Andres Rodriguez

Add comment that was removed by mistake

f2ea6e0... by Andres Rodriguez

Fix tests

Revision history for this message
Newell Jensen (newell-jensen) wrote :

LGTM. Thanks for the fixes.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/models/node.py b/src/maasserver/models/node.py
2index 1ec195c..f1c3e7e 100644
3--- a/src/maasserver/models/node.py
4+++ b/src/maasserver/models/node.py
5@@ -2406,15 +2406,6 @@ class Node(CleanSave, TimestampedModel):
6 power_params = self.power_parameters.copy()
7
8 power_params.setdefault('system_id', self.system_id)
9- # TODO: We should not be sending these paths to the templates;
10- # the templates ought to know which tool to use themselves.
11- power_params.setdefault('fence_cdu', '/usr/sbin/fence_cdu')
12- power_params.setdefault('ipmipower', '/usr/sbin/ipmipower')
13- power_params.setdefault('ipmitool', '/usr/bin/ipmitool')
14- power_params.setdefault(
15- 'ipmi_chassis_config', '/usr/sbin/ipmi-chassis-config')
16- power_params.setdefault('ipmi_config', 'ipmi.conf')
17- # TODO: /end of paths that templates should know.
18 # TODO: This default ought to be in the virsh template.
19 if self.bmc is not None and self.bmc.power_type == "virsh":
20 power_params.setdefault(
21diff --git a/src/provisioningserver/drivers/power/fence_cdu.py b/src/provisioningserver/drivers/power/fence_cdu.py
22index 8699e31..513cefa 100644
23--- a/src/provisioningserver/drivers/power/fence_cdu.py
24+++ b/src/provisioningserver/drivers/power/fence_cdu.py
25@@ -47,12 +47,12 @@ class FenceCDUPowerDriver(PowerDriver):
26 return []
27
28 def _issue_fence_cdu_command(
29- self, command, fence_cdu=None, power_address=None, power_id=None,
30+ self, command, power_address=None, power_id=None,
31 power_user=None, power_pass=None, **extra):
32 """Issue fence_cdu command for the given power change."""
33 try:
34 stdout = call_and_check([
35- fence_cdu, '-a', power_address, '-n', power_id, '-l',
36+ 'fence_cdu', '-a', power_address, '-n', power_id, '-l',
37 power_user, '-p', power_pass, '-o', command],
38 env=select_c_utf8_locale())
39 except ExternalProcessError as e:
40diff --git a/src/provisioningserver/drivers/power/ipmi.py b/src/provisioningserver/drivers/power/ipmi.py
41index 7b9d945..9ef5ba4 100644
42--- a/src/provisioningserver/drivers/power/ipmi.py
43+++ b/src/provisioningserver/drivers/power/ipmi.py
44@@ -234,8 +234,7 @@ class IPMIPowerDriver(PowerDriver):
45 def _issue_ipmi_command(
46 self, power_change, power_address=None, power_user=None,
47 power_pass=None, power_driver=None, power_off_mode=None,
48- ipmipower=None, ipmi_chassis_config=None, mac_address=None,
49- **extra):
50+ mac_address=None, **extra):
51 """Issue command to ipmipower, for the given system."""
52 # This script deliberately does not check the current power state
53 # before issuing the requested power command. See bug 1171418 for an
54@@ -249,9 +248,9 @@ class IPMIPowerDriver(PowerDriver):
55 # should have no impact on BMCs that don't require it.
56 # See https://bugs.launchpad.net/maas/+bug/1287964
57 ipmi_chassis_config_command = [
58- ipmi_chassis_config, '-W', 'opensesspriv']
59+ 'ipmi-chassis-config', '-W', 'opensesspriv']
60 ipmipower_command = [
61- ipmipower, '-W', 'opensesspriv']
62+ 'ipmipower', '-W', 'opensesspriv']
63
64 # Arguments in common between chassis config and power control. See
65 # https://launchpad.net/bugs/1053391 for details of modifying the
66diff --git a/src/provisioningserver/drivers/power/moonshot.py b/src/provisioningserver/drivers/power/moonshot.py
67index 2db3e9e..1f65424 100644
68--- a/src/provisioningserver/drivers/power/moonshot.py
69+++ b/src/provisioningserver/drivers/power/moonshot.py
70@@ -46,11 +46,11 @@ class MoonshotIPMIPowerDriver(PowerDriver):
71 return []
72
73 def _issue_ipmitool_command(
74- self, power_change, ipmitool=None, power_address=None,
75- power_user=None, power_pass=None, power_hwaddress=None, **extra):
76+ self, power_change, power_address=None, power_user=None,
77+ power_pass=None, power_hwaddress=None, **extra):
78 """Issue ipmitool command for HP Moonshot cartridge."""
79 command = (
80- ipmitool, '-I', 'lanplus', '-H', power_address,
81+ 'ipmitool', '-I', 'lanplus', '-H', power_address,
82 '-U', power_user, '-P', power_pass
83 ) + tuple(power_hwaddress.split())
84 if power_change == 'pxe':
85diff --git a/src/provisioningserver/drivers/power/tests/test_fence_cdu.py b/src/provisioningserver/drivers/power/tests/test_fence_cdu.py
86index 292a078..cec9ca8 100644
87--- a/src/provisioningserver/drivers/power/tests/test_fence_cdu.py
88+++ b/src/provisioningserver/drivers/power/tests/test_fence_cdu.py
89@@ -51,11 +51,11 @@ class TestFenceCDUPowerDriver(MAASTestCase):
90 mock = self.patch(fence_cdu_module, 'call_and_check')
91 mock.return_value = b'test'
92 stdout = driver._issue_fence_cdu_command(
93- sentinel.command, sentinel.fence_cdu, sentinel.power_address,
94+ sentinel.command, sentinel.power_address,
95 sentinel.power_id, sentinel.power_user, sentinel.power_pass)
96 self.expectThat(
97 mock, MockCalledOnceWith([
98- sentinel.fence_cdu, '-a', sentinel.power_address, '-n',
99+ 'fence_cdu', '-a', sentinel.power_address, '-n',
100 sentinel.power_id, '-l', sentinel.power_user, '-p',
101 sentinel.power_pass, '-o', sentinel.command],
102 env=select_c_utf8_locale()))
103@@ -66,7 +66,7 @@ class TestFenceCDUPowerDriver(MAASTestCase):
104 mock = self.patch(fence_cdu_module, 'call_and_check')
105 mock.side_effect = ExternalProcessError(2, "Fence CDU error")
106 stdout = driver._issue_fence_cdu_command(
107- 'status', sentinel.fence_cdu, sentinel.power_address,
108+ 'status', sentinel.power_address,
109 sentinel.power_id, sentinel.power_user, sentinel.power_pass)
110 self.assertThat(stdout, Equals("Status: OFF\n"))
111
112@@ -76,12 +76,12 @@ class TestFenceCDUPowerDriver(MAASTestCase):
113 mock.side_effect = ExternalProcessError(1, "Fence CDU error")
114 self.assertRaises(
115 PowerError, driver._issue_fence_cdu_command, sentinel.command,
116- sentinel.fence_cdu, sentinel.power_address, sentinel.power_id,
117+ sentinel.power_address, sentinel.power_id,
118 sentinel.power_user, sentinel.power_pass)
119
120 def make_context(self):
121 return {
122- 'fence_cdu': sentinel.fence_cdu,
123+ 'fence_cdu': 'fence_cdu',
124 'power_address': sentinel.power_address,
125 'power_id': sentinel.power_id,
126 'power_user': sentinel.power_user,
127@@ -101,16 +101,16 @@ class TestFenceCDUPowerDriver(MAASTestCase):
128
129 self.assertThat(
130 mock, MockCallsMatch(
131- call([sentinel.fence_cdu, '-a', sentinel.power_address, '-n',
132+ call(['fence_cdu', '-a', sentinel.power_address, '-n',
133 sentinel.power_id, '-l', sentinel.power_user, '-p',
134 sentinel.power_pass, '-o', 'status'], env=environ),
135- call([sentinel.fence_cdu, '-a', sentinel.power_address, '-n',
136+ call(['fence_cdu', '-a', sentinel.power_address, '-n',
137 sentinel.power_id, '-l', sentinel.power_user, '-p',
138 sentinel.power_pass, '-o', 'off'], env=environ),
139- call([sentinel.fence_cdu, '-a', sentinel.power_address, '-n',
140+ call(['fence_cdu', '-a', sentinel.power_address, '-n',
141 sentinel.power_id, '-l', sentinel.power_user, '-p',
142 sentinel.power_pass, '-o', 'status'], env=environ),
143- call([sentinel.fence_cdu, '-a', sentinel.power_address, '-n',
144+ call(['fence_cdu', '-a', sentinel.power_address, '-n',
145 sentinel.power_id, '-l', sentinel.power_user, '-p',
146 sentinel.power_pass, '-o', 'on'], env=environ)))
147
148diff --git a/src/provisioningserver/drivers/power/tests/test_ipmi.py b/src/provisioningserver/drivers/power/tests/test_ipmi.py
149index cc3e6a8..bc5d3fb 100644
150--- a/src/provisioningserver/drivers/power/tests/test_ipmi.py
151+++ b/src/provisioningserver/drivers/power/tests/test_ipmi.py
152@@ -47,8 +47,8 @@ def make_context():
153 'power_pass': factory.make_name('power_pass'),
154 'power_driver': factory.make_name('power_driver'),
155 'power_off_mode': factory.make_name('power_off_mode'),
156- 'ipmipower': factory.make_name('ipmipower'),
157- 'ipmi_chassis_config': factory.make_name('ipmi_chassis_config'),
158+ 'ipmipower': 'ipmipower',
159+ 'ipmi_chassis_config': 'ipmi-chassis-config',
160 }
161
162
163diff --git a/src/provisioningserver/drivers/power/tests/test_moonshot.py b/src/provisioningserver/drivers/power/tests/test_moonshot.py
164index 3e8ea13..388ad78 100644
165--- a/src/provisioningserver/drivers/power/tests/test_moonshot.py
166+++ b/src/provisioningserver/drivers/power/tests/test_moonshot.py
167@@ -28,7 +28,7 @@ from testtools.matchers import Equals
168
169 def make_context():
170 return {
171- 'ipmitool': factory.make_name('ipmitool'),
172+ 'ipmitool': 'ipmitool',
173 'power_address': factory.make_name('power_address'),
174 'power_user': factory.make_name('power_user'),
175 'power_pass': factory.make_name('power_pass'),

Subscribers

People subscribed via source and target branches