Merge changes from topic 'simplify-ipmi-adapter'
[fuel.git] / deploy / dha_adapters / amt_adapter.py
1 ###############################################################################
2 # Copyright (c) 2015 Ericsson AB and others.
3 # liyi.meng@ericsson.com
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ###############################################################################
9
10
11 from hardware_adapter import HardwareAdapter
12
13 from common import (
14     log,
15     exec_cmd,
16     err,
17 )
18
19
20 '''
21 This is hardware adapter for Intel AMT based system. It use amttool to interact
22  with the targeting node. It dose not support vPro v9. if the targeting system
23  is v9 or later, we need to consider a new adpater with using lib
24  like https://github.com/sdague/amt
25 '''
26 class AmtAdapter(HardwareAdapter):
27
28     def __init__(self, yaml_path):
29         super(AmtAdapter, self).__init__(yaml_path)
30         #amttool dose not allow you change bios setting permanently.
31         # so we have to make a workaround to make it IPMI like.
32         self.boot_order = {}
33
34     def node_get_boot_dev(self, node_id):
35         if node_id in self.boot_order:
36             dev = self.boot_order[node_id][0]
37             if dev == 'pxe':
38                 return 'PXE-boot'
39             elif dev == 'iso':
40                 return 'cd-boot'
41             elif dev == 'disk':
42                 return 'HD-boot'
43         else:
44             return 'HD-boot'
45
46     def get_access_info(self, node_id):
47         ip = self.get_node_property(node_id, 'amtIp')
48         username = self.get_node_property(node_id, 'amtUser')
49         password = self.get_node_property(node_id, 'amtPass')
50         return ip, username, password
51
52     def amt_cmd(self, node_id):
53         ip, username, password = self.get_access_info(node_id)
54         # We first Setup password for amttool, then use ping to wake up the node over LAN
55         cmd = 'export AMT_PASSWORD={0};' \
56               'ping {1} -W 5 -c 1 -q;' \
57               'yes | amttool {1}'.format(password, ip)
58         return cmd
59
60     def get_node_pxe_mac(self, node_id):
61         mac_list = []
62         mac_list.append(self.get_node_property(node_id, 'pxeMac').lower())
63         return mac_list
64
65     def node_power_on(self, node_id):
66         log('Power ON Node %s' % node_id)
67         cmd_prefix = self.amt_cmd(node_id)
68         resp, ret = exec_cmd('{0} info'.format(cmd_prefix), check=False)
69         if 'Powerstate:   S0' not in resp:
70             dev = self.node_get_boot_dev(node_id)
71             resp, ret = exec_cmd('{0} powerup {1}'.format(cmd_prefix, dev), check=False)
72             if 'pt_status: success' not in resp:
73                 err('Could Not Power ON Node %s' % node_id)
74
75     def node_power_off(self, node_id):
76         log('Power OFF Node %s' % node_id)
77         cmd_prefix = self.amt_cmd(node_id)
78         resp, ret = exec_cmd('{0} info'.format(cmd_prefix), check=False)
79         if "Powerstate:   S0" in resp:
80             resp, ret = exec_cmd('{0} powerdown'.format(cmd_prefix), check=False)
81             if 'pt_status: success' not in resp:
82                 err('Could Not Power OFF Node %s' % node_id)
83
84     def node_reset(self, node_id):
85         log('RESET Node %s' % node_id)
86         cmd_prefix = self.amt_cmd(node_id)
87         dev = self.node_get_boot_dev(node_id)
88         resp, ret = exec_cmd('{0} info'.format(cmd_prefix), check=False)
89         if 'Powerstate:   S0' in resp:
90             resp, ret = exec_cmd('{0} reset {1}'.format(cmd_prefix, dev), check=False)
91             if 'pt_status: success' not in resp:
92                 err('Could Not RESET Node %s' % node_id)
93         else:
94             err('Cannot RESET Node %s because it\'s not Active, state: %s'
95                 % (node_id, resp))
96
97     def node_set_boot_order(self, node_id, boot_order_list):
98         log('Set boot order %s on Node %s' % (boot_order_list, node_id))
99         self.boot_order[node_id] = boot_order_list
100