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
1=== modified file 'src/provisioningserver/drivers/power/__init__.py'
2--- src/provisioningserver/drivers/power/__init__.py 2015-11-17 19:49:40 +0000
3+++ src/provisioningserver/drivers/power/__init__.py 2016-02-08 17:27:30 +0000
4@@ -322,6 +322,7 @@
5 from provisioningserver.drivers.power.amt import AMTPowerDriver
6 from provisioningserver.drivers.power.apc import APCPowerDriver
7 from provisioningserver.drivers.power.dli import DLIPowerDriver
8+from provisioningserver.drivers.power.wedge import WedgePowerDriver
9 from provisioningserver.drivers.power.ether_wake import EtherWakePowerDriver
10 from provisioningserver.drivers.power.fence_cdu import FenceCDUPowerDriver
11 from provisioningserver.drivers.power.hmc import HMCPowerDriver
12@@ -337,6 +338,7 @@
13 registered_power_drivers = [
14 APCPowerDriver(),
15 DLIPowerDriver(),
16+ WedgePowerDriver(),
17 HMCPowerDriver(),
18 IPMIPowerDriver(),
19 MicrosoftOCSPowerDriver(),
20
21=== added file 'src/provisioningserver/drivers/power/wedge.py'
22--- src/provisioningserver/drivers/power/wedge.py 1970-01-01 00:00:00 +0000
23+++ src/provisioningserver/drivers/power/wedge.py 2016-02-08 17:27:30 +0000
24@@ -0,0 +1,81 @@
25+# Copyright 2015 Canonical Ltd. This software is licensed under the
26+# GNU Affero General Public License version 3 (see the file LICENSE).
27+
28+"""Wedge Power Driver."""
29+
30+from __future__ import (
31+ absolute_import,
32+ print_function,
33+ unicode_literals,
34+ )
35+
36+str = None
37+
38+__metaclass__ = type
39+__all__ = []
40+
41+from provisioningserver.drivers.power import (
42+ PowerDriver,
43+ PowerError,
44+ PowerFatalError,
45+)
46+
47+from paramiko import (
48+ AutoAddPolicy,
49+ SSHClient,
50+ SSHException,
51+)
52+
53+def extract_wedge_parameters(context):
54+ ip = context.get('power_address')
55+ username = context.get('power_user')
56+ password = context.get('power_pass')
57+ return ip, username, password
58+
59+class WedgePowerDriver(PowerDriver):
60+ name = 'wedge'
61+ description = "Facebook Wedge OpenBmc Power Driver."
62+ settings = []
63+
64+ def detect_missing_packages(self):
65+ # uses pure-python paramiko ssh client - nothing to look for!
66+ return []
67+
68+ def _run_ssh_command(self, ip, username, password, command):
69+ """Run a single command and return unparsed text from stdout."""
70+ self._ssh = SSHClient()
71+ self._ssh.set_missing_host_key_policy(AutoAddPolicy())
72+ self._ssh.connect(ip, username=username, password=password)
73+ try:
74+ _, stdout, _ = self._ssh.exec_command(command)
75+ output = stdout.read()
76+ finally:
77+ self._ssh.close()
78+
79+ return output
80+
81+ def power_on(self, system_id, context):
82+ """Power on Wedge."""
83+ ip, username, password = (extract_wedge_parameters(context))
84+ power_state = self._run_ssh_command(ip, username, password, "/usr/local/bin/wedge_power.sh on")
85+
86+ def power_off(self, system_id, context):
87+ """Power off Wedge."""
88+ ip, username, password = (extract_wedge_parameters(context))
89+ power_state = self._run_ssh_command(ip, username, password, "/usr/local/bin/wedge_power.sh off")
90+
91+ def power_query(self, system_id, context):
92+ """Power query Wedge."""
93+ ip, username, password = (extract_wedge_parameters(context))
94+ power_state = self._run_ssh_command(ip, username, password, "/usr/local/bin/wedge_power.sh status")
95+ return power_state.split("Microserver power is ")[1].split('\n')[0]
96+
97+
98+# The following is just for debugging purposes
99+def main():
100+ wedge = WedgePowerDriver()
101+ power_state = wedge._run_ssh_command("192.168.10.32", "root", "0penBmc", "/usr/local/bin/wedge_power.sh status")
102+ print(power_state.split("Microserver power is ")[1].split('\n')[0])
103+
104+if __name__ == "__main__":
105+ main()
106
107=== modified file 'src/provisioningserver/power/__init__.py'
108--- src/provisioningserver/power/__init__.py 2015-12-04 20:57:06 +0000
109+++ src/provisioningserver/power/__init__.py 2016-02-08 17:27:30 +0000
110@@ -32,6 +32,7 @@
111 'amt',
112 'hmc',
113 'ipmi',
114+ 'wedge',
115 'mscm',
116 'msftocs',
117 'sm15k',
118
119=== modified file 'src/provisioningserver/power/schema.py'
120--- src/provisioningserver/power/schema.py 2015-11-02 16:53:04 +0000
121+++ src/provisioningserver/power/schema.py 2016-02-08 17:27:30 +0000
122@@ -271,6 +271,16 @@
123 ],
124 },
125 {
126+ 'name': 'wedge',
127+ 'description': 'Facebook Wedge OpenBMC',
128+ 'fields': [
129+ make_json_field('power_address', "OpenBMC IP Address"),
130+ make_json_field('power_user', "OpenBMC username"),
131+ make_json_field(
132+ 'power_pass', "OpenBMC password", field_type='password'),
133+ ],
134+ },
135+ {
136 'name': 'ucsm',
137 'description': "Cisco UCS Manager",
138 'fields': [

Subscribers

People subscribed via source and target branches