Merge lp:~dduffey/maas/wedge-1.9 into lp:maas/1.9

Proposed by David Duffey
Status: Rejected
Rejected by: Blake Rouse
Proposed branch: lp:~dduffey/maas/wedge-1.9
Merge into: lp:maas/1.9
Diff against target: 138 lines (+94/-0)
4 files modified
src/provisioningserver/drivers/power/__init__.py (+2/-0)
src/provisioningserver/drivers/power/wedge.py (+81/-0)
src/provisioningserver/power/__init__.py (+1/-0)
src/provisioningserver/power/schema.py (+10/-0)
To merge this branch: bzr merge lp:~dduffey/maas/wedge-1.9
Reviewer Review Type Date Requested Status
Blake Rouse (community) Needs Fixing
Review via email: mp+285382@code.launchpad.net

Description of the change

Added Facebook Wedge OpenBMC power driver support

To post a comment you must log in.
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Thanks for working on this. Many things need to be addressed in this branch. I have included many inline comments, but the real blockers are below.

1. We almost always land in trunk and then backport. So you need to have this working on MAAS trunk first. There is a big different between 1.9 and trunk now, and that is trunk is python 3 only. YOu need to make sure this works with MAAS trunk and on Xenial and then do the backport. That needs to be QA'd on both 1.9 and trunk. We cannot help you with the QA process as we do not have access to this hardware.

2. No unit tests have been provided with this branch. It is a requirement that any branch that lands in MAAS contain unit tests. This power driver will be something people will come to rely on working, adding unit tests will ensure that it does not get broken as other features, fixes, and more power drivers are added to MAAS.

review: Needs Fixing
Revision history for this message
David Duffey (dduffey) wrote :

Hi Blake, thanks for reviewing this. I have updated this to trunk / python 3 and tested with MAAS 2.0 and a Facebook 40 and a Facebook 100. Facebook is going to have an event in January where they would like to highlight MAAS, so I'm going to try and get through these. I've put comments below where need some guidance.

I'll ask Luke Williams to write the unit tests (a bit beyond my abilities), if you have some particularly 'good' one we should try and follow.

Unmerged revisions

4540. By David Duffey

Added Facebook Wedge OpenBMC Power Driver

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/provisioningserver/drivers/power/__init__.py'
--- src/provisioningserver/drivers/power/__init__.py 2015-11-17 19:49:40 +0000
+++ src/provisioningserver/drivers/power/__init__.py 2016-02-08 17:27:30 +0000
@@ -322,6 +322,7 @@
322from provisioningserver.drivers.power.amt import AMTPowerDriver322from provisioningserver.drivers.power.amt import AMTPowerDriver
323from provisioningserver.drivers.power.apc import APCPowerDriver323from provisioningserver.drivers.power.apc import APCPowerDriver
324from provisioningserver.drivers.power.dli import DLIPowerDriver324from provisioningserver.drivers.power.dli import DLIPowerDriver
325from provisioningserver.drivers.power.wedge import WedgePowerDriver
325from provisioningserver.drivers.power.ether_wake import EtherWakePowerDriver326from provisioningserver.drivers.power.ether_wake import EtherWakePowerDriver
326from provisioningserver.drivers.power.fence_cdu import FenceCDUPowerDriver327from provisioningserver.drivers.power.fence_cdu import FenceCDUPowerDriver
327from provisioningserver.drivers.power.hmc import HMCPowerDriver328from provisioningserver.drivers.power.hmc import HMCPowerDriver
@@ -337,6 +338,7 @@
337registered_power_drivers = [338registered_power_drivers = [
338 APCPowerDriver(),339 APCPowerDriver(),
339 DLIPowerDriver(),340 DLIPowerDriver(),
341 WedgePowerDriver(),
340 HMCPowerDriver(),342 HMCPowerDriver(),
341 IPMIPowerDriver(),343 IPMIPowerDriver(),
342 MicrosoftOCSPowerDriver(),344 MicrosoftOCSPowerDriver(),
343345
=== added file 'src/provisioningserver/drivers/power/wedge.py'
--- src/provisioningserver/drivers/power/wedge.py 1970-01-01 00:00:00 +0000
+++ src/provisioningserver/drivers/power/wedge.py 2016-02-08 17:27:30 +0000
@@ -0,0 +1,81 @@
1# Copyright 2015 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).
3
4"""Wedge Power Driver."""
5
6from __future__ import (
7 absolute_import,
8 print_function,
9 unicode_literals,
10 )
11
12str = None
13
14__metaclass__ = type
15__all__ = []
16
17from provisioningserver.drivers.power import (
18 PowerDriver,
19 PowerError,
20 PowerFatalError,
21)
22
23from paramiko import (
24 AutoAddPolicy,
25 SSHClient,
26 SSHException,
27)
28
29def extract_wedge_parameters(context):
30 ip = context.get('power_address')
31 username = context.get('power_user')
32 password = context.get('power_pass')
33 return ip, username, password
34
35class WedgePowerDriver(PowerDriver):
36 name = 'wedge'
37 description = "Facebook Wedge OpenBmc Power Driver."
38 settings = []
39
40 def detect_missing_packages(self):
41 # uses pure-python paramiko ssh client - nothing to look for!
42 return []
43
44 def _run_ssh_command(self, ip, username, password, command):
45 """Run a single command and return unparsed text from stdout."""
46 self._ssh = SSHClient()
47 self._ssh.set_missing_host_key_policy(AutoAddPolicy())
48 self._ssh.connect(ip, username=username, password=password)
49 try:
50 _, stdout, _ = self._ssh.exec_command(command)
51 output = stdout.read()
52 finally:
53 self._ssh.close()
54
55 return output
56
57 def power_on(self, system_id, context):
58 """Power on Wedge."""
59 ip, username, password = (extract_wedge_parameters(context))
60 power_state = self._run_ssh_command(ip, username, password, "/usr/local/bin/wedge_power.sh on")
61
62 def power_off(self, system_id, context):
63 """Power off Wedge."""
64 ip, username, password = (extract_wedge_parameters(context))
65 power_state = self._run_ssh_command(ip, username, password, "/usr/local/bin/wedge_power.sh off")
66
67 def power_query(self, system_id, context):
68 """Power query Wedge."""
69 ip, username, password = (extract_wedge_parameters(context))
70 power_state = self._run_ssh_command(ip, username, password, "/usr/local/bin/wedge_power.sh status")
71 return power_state.split("Microserver power is ")[1].split('\n')[0]
72
73
74# The following is just for debugging purposes
75def main():
76 wedge = WedgePowerDriver()
77 power_state = wedge._run_ssh_command("192.168.10.32", "root", "0penBmc", "/usr/local/bin/wedge_power.sh status")
78 print(power_state.split("Microserver power is ")[1].split('\n')[0])
79
80if __name__ == "__main__":
81 main()
082
=== modified file 'src/provisioningserver/power/__init__.py'
--- src/provisioningserver/power/__init__.py 2015-12-04 20:57:06 +0000
+++ src/provisioningserver/power/__init__.py 2016-02-08 17:27:30 +0000
@@ -32,6 +32,7 @@
32 'amt',32 'amt',
33 'hmc',33 'hmc',
34 'ipmi',34 'ipmi',
35 'wedge',
35 'mscm',36 'mscm',
36 'msftocs',37 'msftocs',
37 'sm15k',38 'sm15k',
3839
=== modified file 'src/provisioningserver/power/schema.py'
--- src/provisioningserver/power/schema.py 2015-11-02 16:53:04 +0000
+++ src/provisioningserver/power/schema.py 2016-02-08 17:27:30 +0000
@@ -271,6 +271,16 @@
271 ],271 ],
272 },272 },
273 {273 {
274 'name': 'wedge',
275 'description': 'Facebook Wedge OpenBMC',
276 'fields': [
277 make_json_field('power_address', "OpenBMC IP Address"),
278 make_json_field('power_user', "OpenBMC username"),
279 make_json_field(
280 'power_pass', "OpenBMC password", field_type='password'),
281 ],
282 },
283 {
274 'name': 'ucsm',284 'name': 'ucsm',
275 'description': "Cisco UCS Manager",285 'description': "Cisco UCS Manager",
276 'fields': [286 'fields': [

Subscribers

People subscribed via source and target branches