Merge lp:~mpontillo/maas/fix-1517097-1.9 into lp:~maas-committers/maas/trunk

Proposed by Mike Pontillo
Status: Superseded
Proposed branch: lp:~mpontillo/maas/fix-1517097-1.9
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 176 lines (+69/-6) (has conflicts)
4 files modified
src/provisioningserver/drivers/power/amt.py (+11/-0)
src/provisioningserver/drivers/power/ipmi.py (+18/-5)
src/provisioningserver/drivers/power/tests/test_amt.py (+17/-0)
src/provisioningserver/drivers/power/tests/test_ipmi.py (+23/-1)
Text conflict in src/provisioningserver/drivers/power/amt.py
Text conflict in src/provisioningserver/drivers/power/ipmi.py
Text conflict in src/provisioningserver/drivers/power/tests/test_amt.py
Text conflict in src/provisioningserver/drivers/power/tests/test_ipmi.py
To merge this branch: bzr merge lp:~mpontillo/maas/fix-1517097-1.9
Reviewer Review Type Date Requested Status
MAAS Maintainers Pending
Review via email: mp+278230@code.launchpad.net

This proposal has been superseded by a proposal from 2015-11-21.

Commit message

Merge fix for #1517097 from trunk revision 4512.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maasserver/models/node.py'
=== modified file 'src/provisioningserver/drivers/power/__init__.py'
=== modified file 'src/provisioningserver/drivers/power/amt.py'
--- src/provisioningserver/drivers/power/amt.py 2015-11-17 02:05:20 +0000
+++ src/provisioningserver/drivers/power/amt.py 2015-11-21 00:18:35 +0000
@@ -53,6 +53,7 @@
53 missing_packages.append(package)53 missing_packages.append(package)
54 return missing_packages54 return missing_packages
5555
56<<<<<<< TREE
56 def _render_wsman_state_xml(self, power_change):57 def _render_wsman_state_xml(self, power_change):
57 """Render wsman state XML."""58 """Render wsman state XML."""
58 wsman_state_filename = join(dirname(__file__), "amt.wsman-state.xml")59 wsman_state_filename = join(dirname(__file__), "amt.wsman-state.xml")
@@ -373,3 +374,13 @@
373 return self.amttool_query_state(ip_address, power_pass)374 return self.amttool_query_state(ip_address, power_pass)
374 elif amt_command == 'wsman':375 elif amt_command == 'wsman':
375 return self.wsman_query_state(ip_address, power_pass)376 return self.wsman_query_state(ip_address, power_pass)
377=======
378 def power_on(self, system_id, context):
379 raise NotImplementedError
380
381 def power_off(self, system_id, context):
382 raise NotImplementedError
383
384 def power_query(self, system_id, context):
385 raise NotImplementedError
386>>>>>>> MERGE-SOURCE
376387
=== modified file 'src/provisioningserver/drivers/power/ipmi.py'
--- src/provisioningserver/drivers/power/ipmi.py 2015-11-18 21:16:42 +0000
+++ src/provisioningserver/drivers/power/ipmi.py 2015-11-21 00:18:35 +0000
@@ -27,6 +27,7 @@
27 PowerDriver,27 PowerDriver,
28 PowerFatalError,28 PowerFatalError,
29)29)
30from provisioningserver.logger import get_maas_logger
30from provisioningserver.utils import shell31from provisioningserver.utils import shell
31from provisioningserver.utils.network import find_ip_via_arp32from provisioningserver.utils.network import find_ip_via_arp
32from provisioningserver.utils.shell import (33from provisioningserver.utils.shell import (
@@ -43,6 +44,16 @@
43"""44"""
4445
4546
47<<<<<<< TREE
48=======
49maaslog = get_maas_logger("drivers.power.ipmi")
50
51
52def is_set(setting):
53 return not (setting is None or setting == "" or setting.isspace())
54
55
56>>>>>>> MERGE-SOURCE
46class IPMIPowerDriver(PowerDriver):57class IPMIPowerDriver(PowerDriver):
4758
48 name = 'ipmi'59 name = 'ipmi'
@@ -55,7 +66,8 @@
55 return []66 return []
5667
57 @staticmethod68 @staticmethod
58 def _issue_ipmi_chassis_config_command(command, change, address, env):69 def _issue_ipmi_chassis_config_command(
70 command, power_change, power_address, env):
59 with NamedTemporaryFile() as tmp_config:71 with NamedTemporaryFile() as tmp_config:
60 # Write out the chassis configuration.72 # Write out the chassis configuration.
61 tmp_config.write(IPMI_CONFIG)73 tmp_config.write(IPMI_CONFIG)
@@ -70,18 +82,19 @@
70 if "password invalid" in stderr:82 if "password invalid" in stderr:
71 raise PowerAuthError("Invalid password.")83 raise PowerAuthError("Invalid password.")
72 if process.returncode != 0:84 if process.returncode != 0:
73 raise PowerFatalError(85 maaslog.warning(
74 "Failed to power %s %s: %s" % (change, address, stderr))86 'Failed to change the boot order to PXE %s: %s' % (
87 power_address, stderr))
7588
76 @staticmethod89 @staticmethod
77 def _issue_ipmi_power_command(command, change, address, env):90 def _issue_ipmi_power_command(command, power_change, power_address, env):
78 command = tuple(command) # For consistency when testing.91 command = tuple(command) # For consistency when testing.
79 try:92 try:
80 output = call_and_check(command, env=env)93 output = call_and_check(command, env=env)
81 except ExternalProcessError as e:94 except ExternalProcessError as e:
82 raise PowerFatalError(95 raise PowerFatalError(
83 "Failed to power %s %s: %s" % (96 "Failed to power %s %s: %s" % (
84 change, address, e.output_as_unicode))97 power_change, power_address, e.output_as_unicode))
85 else:98 else:
86 if 'on' in output:99 if 'on' in output:
87 return 'on'100 return 'on'
88101
=== modified file 'src/provisioningserver/drivers/power/tests/test_amt.py'
--- src/provisioningserver/drivers/power/tests/test_amt.py 2015-11-17 02:05:20 +0000
+++ src/provisioningserver/drivers/power/tests/test_amt.py 2015-11-21 00:18:35 +0000
@@ -99,6 +99,7 @@
99 missing = driver.detect_missing_packages()99 missing = driver.detect_missing_packages()
100 self.assertItemsEqual([], missing)100 self.assertItemsEqual([], missing)
101101
102<<<<<<< TREE
102 def test__render_wsman_state_xml_renders_xml(self):103 def test__render_wsman_state_xml_renders_xml(self):
103 amt_power_driver = AMTPowerDriver()104 amt_power_driver = AMTPowerDriver()
104 power_change = choice(['on', 'off', 'restart'])105 power_change = choice(['on', 'off', 'restart'])
@@ -780,3 +781,19 @@
780 wsman_query_state_mock, MockCalledOnceWith(781 wsman_query_state_mock, MockCalledOnceWith(
781 context['ip_address'], context['power_pass']))782 context['ip_address'], context['power_pass']))
782 self.expectThat(state, Equals('on'))783 self.expectThat(state, Equals('on'))
784=======
785 def test_power_on(self):
786 driver = amt_module.AMTPowerDriver()
787 self.assertRaises(
788 NotImplementedError, driver.power_on, "fake_id", {})
789
790 def test_power_off(self):
791 driver = amt_module.AMTPowerDriver()
792 self.assertRaises(
793 NotImplementedError, driver.power_off, "fake_id", {})
794
795 def test_power_query(self):
796 driver = amt_module.AMTPowerDriver()
797 self.assertRaises(
798 NotImplementedError, driver.power_query, "fake_id", {})
799>>>>>>> MERGE-SOURCE
783800
=== modified file 'src/provisioningserver/drivers/power/tests/test_ipmi.py'
--- src/provisioningserver/drivers/power/tests/test_ipmi.py 2015-11-17 02:05:20 +0000
+++ src/provisioningserver/drivers/power/tests/test_ipmi.py 2015-11-21 00:18:35 +0000
@@ -269,8 +269,13 @@
269 ipmipower_command, env=env))269 ipmipower_command, env=env))
270 self.expectThat(result, Equals('other'))270 self.expectThat(result, Equals('other'))
271271
272<<<<<<< TREE
272 def test__issue_ipmi_command_issues_raises_power_auth_error(self):273 def test__issue_ipmi_command_issues_raises_power_auth_error(self):
273 _, _, _, _, _, _, _, context = make_parameters()274 _, _, _, _, _, _, _, context = make_parameters()
275=======
276 def test__issue_ipmi_command_raises_power_fatal_error(self):
277 _, _, _, _, _, _, _, context = make_parameters()
278>>>>>>> MERGE-SOURCE
274 ipmi_power_driver = IPMIPowerDriver()279 ipmi_power_driver = IPMIPowerDriver()
275 popen_mock = self.patch(ipmi_module, 'Popen')280 popen_mock = self.patch(ipmi_module, 'Popen')
276 process = popen_mock.return_value281 process = popen_mock.return_value
@@ -281,17 +286,34 @@
281 PowerAuthError, ipmi_power_driver._issue_ipmi_command,286 PowerAuthError, ipmi_power_driver._issue_ipmi_command,
282 'on', **context)287 'on', **context)
283288
289<<<<<<< TREE
284 def test__issue_ipmi_command_issues_raises_power_fatal_error(self):290 def test__issue_ipmi_command_issues_raises_power_fatal_error(self):
285 _, _, _, _, _, _, _, context = make_parameters()291 _, _, _, _, _, _, _, context = make_parameters()
292=======
293 def test__issue_ipmi_command_logs_maaslog_warning(self):
294 _, _, _, _, _, _, _, context = make_parameters()
295>>>>>>> MERGE-SOURCE
286 ipmi_power_driver = IPMIPowerDriver()296 ipmi_power_driver = IPMIPowerDriver()
287 popen_mock = self.patch(ipmi_module, 'Popen')297 popen_mock = self.patch(ipmi_module, 'Popen')
288 process = popen_mock.return_value298 process = popen_mock.return_value
289 process.communicate.return_value = (None, '')299 process.communicate.return_value = (None, 'maaslog error')
290 process.returncode = -1300 process.returncode = -1
301<<<<<<< TREE
291302
292 self.assertRaises(303 self.assertRaises(
293 PowerFatalError, ipmi_power_driver._issue_ipmi_command,304 PowerFatalError, ipmi_power_driver._issue_ipmi_command,
294 'on', **context)305 'on', **context)
306=======
307 maaslog = self.patch(ipmi_module, 'maaslog')
308 self.patch(ipmi_power_driver, '_issue_ipmi_power_command')
309
310 ipmi_power_driver._issue_ipmi_command('on', **context)
311
312 self.assertThat(
313 maaslog.warning, MockCalledOnceWith(
314 'Failed to change the boot order to PXE %s: %s' % (
315 context['power_address'], 'maaslog error')))
316>>>>>>> MERGE-SOURCE
295317
296 def test__issue_ipmi_command_issues_catches_external_process_error(self):318 def test__issue_ipmi_command_issues_catches_external_process_error(self):
297 _, _, _, _, _, _, _, context = make_parameters()319 _, _, _, _, _, _, _, context = make_parameters()