Merge "Fixes external network bridge and adds quota limits"
[genesis.git] / fuel / deploy / dha_adapters / ipmi_adapter.py
1 import common
2 import time
3 from hardware_adapter import HardwareAdapter
4
5 log = common.log
6 exec_cmd = common.exec_cmd
7 err = common.err
8
9 class IpmiAdapter(HardwareAdapter):
10
11     def __init__(self, yaml_path):
12         super(IpmiAdapter, self).__init__(yaml_path)
13
14     def get_access_info(self, node_id):
15         ip = self.get_node_property(node_id, 'ipmiIp')
16         username = self.get_node_property(node_id, 'ipmiUser')
17         password = self.get_node_property(node_id, 'ipmiPass')
18         return ip, username, password
19
20     def ipmi_cmd(self, node_id):
21         ip, username, password = self.get_access_info(node_id)
22         cmd = 'ipmitool -I lanplus -A password'
23         cmd += ' -H %s -U %s -P %s' % (ip, username, password)
24         return cmd
25
26     def get_node_pxe_mac(self, node_id):
27         mac_list = []
28         mac_list.append(self.get_node_property(node_id, 'pxeMac').lower())
29         return mac_list
30
31     def node_power_on(self, node_id):
32         WAIT_LOOP = 200
33         SLEEP_TIME = 3
34         log('Power ON Node %s' % node_id)
35         cmd_prefix = self.ipmi_cmd(node_id)
36         state = exec_cmd('%s chassis power status' % cmd_prefix)
37         if state == 'Chassis Power is off':
38             exec_cmd('%s chassis power on' % cmd_prefix)
39             done = False
40             for i in range(WAIT_LOOP):
41                 state, _ = exec_cmd('%s chassis power status' % cmd_prefix,
42                                     False)
43                 if state == 'Chassis Power is on':
44                     done = True
45                     break
46                 else:
47                     time.sleep(SLEEP_TIME)
48             if not done:
49                 err('Could Not Power ON Node %s' % node_id)
50
51     def node_power_off(self, node_id):
52         WAIT_LOOP = 200
53         SLEEP_TIME = 3
54         log('Power OFF Node %s' % node_id)
55         cmd_prefix = self.ipmi_cmd(node_id)
56         state = exec_cmd('%s chassis power status' % cmd_prefix)
57         if state == 'Chassis Power is on':
58             done = False
59             exec_cmd('%s chassis power off' % cmd_prefix)
60             for i in range(WAIT_LOOP):
61                 state, _ = exec_cmd('%s chassis power status' % cmd_prefix,
62                                     False)
63                 if state == 'Chassis Power is off':
64                     done = True
65                     break
66                 else:
67                     time.sleep(SLEEP_TIME)
68             if not done:
69                 err('Could Not Power OFF Node %s' % node_id)
70
71     def node_reset(self, node_id):
72         WAIT_LOOP = 600
73         log('RESET Node %s' % node_id)
74         cmd_prefix = self.ipmi_cmd(node_id)
75         state = exec_cmd('%s chassis power status' % cmd_prefix)
76         if state == 'Chassis Power is on':
77             was_shut_off = False
78             done = False
79             exec_cmd('%s chassis power reset' % cmd_prefix)
80             for i in range(WAIT_LOOP):
81                 state, _ = exec_cmd('%s chassis power status' % cmd_prefix,
82                                     False)
83                 if state == 'Chassis Power is off':
84                     was_shut_off = True
85                 elif state == 'Chassis Power is on' and was_shut_off:
86                     done = True
87                     break
88                 time.sleep(1)
89             if not done:
90                 err('Could Not RESET Node %s' % node_id)
91         else:
92             err('Cannot RESET Node %s because it\'s not Active, state: %s'
93                 % (node_id, state))
94
95     def node_set_boot_order(self, node_id, boot_order_list):
96         log('Set boot order %s on Node %s' % (boot_order_list, node_id))
97         boot_order_list.reverse()
98         cmd_prefix = self.ipmi_cmd(node_id)
99         for dev in boot_order_list:
100             if dev == 'pxe':
101                 exec_cmd('%s chassis bootdev pxe options=persistent'
102                          % cmd_prefix)
103             elif dev == 'iso':
104                 exec_cmd('%s chassis bootdev cdrom' % cmd_prefix)
105             elif dev == 'disk':
106                 exec_cmd('%s chassis bootdev disk options=persistent'
107                          % cmd_prefix)