Supports OPERATOR priv level for ipmitool driver
This could be fixed by adding an optional member of node's driver_info to store the privilege level. And add '-L' option for ipmitool command call. Change-Id: Ia3cb2ade8b6823a6d33db2fc22da940211c60b7d Closes-Bug: #1263790
This commit is contained in:
parent
6a1c153de6
commit
44781dbacd
|
@ -42,6 +42,7 @@ CONF = cfg.CONF
|
|||
LOG = logging.getLogger(__name__)
|
||||
|
||||
VALID_BOOT_DEVICES = ['pxe', 'disk', 'safe', 'cdrom', 'bios']
|
||||
VALID_PRIV_LEVELS = ['ADMINISTRATOR', 'CALLBACK', 'OPERATOR', 'USER']
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
|
@ -78,17 +79,26 @@ def _parse_driver_info(node):
|
|||
username = info.get('ipmi_username')
|
||||
password = info.get('ipmi_password')
|
||||
port = info.get('ipmi_terminal_port')
|
||||
priv_level = info.get('ipmi_priv_level', 'ADMINISTRATOR')
|
||||
|
||||
if not address:
|
||||
raise exception.InvalidParameterValue(_(
|
||||
"IPMI address not supplied to IPMI driver."))
|
||||
|
||||
if priv_level not in VALID_PRIV_LEVELS:
|
||||
valid_priv_lvls = ', '.join(VALID_PRIV_LEVELS)
|
||||
raise exception.InvalidParameterValue(_(
|
||||
"Invalid privilege level value:%(priv_level)s, the valid value"
|
||||
" can be one of %(valid_levels)s") %
|
||||
{'priv_level': priv_level, 'valid_levels': valid_priv_lvls})
|
||||
|
||||
return {
|
||||
'address': address,
|
||||
'username': username,
|
||||
'password': password,
|
||||
'port': port,
|
||||
'uuid': node.get('uuid')
|
||||
'uuid': node.get('uuid'),
|
||||
'priv_level': priv_level
|
||||
}
|
||||
|
||||
|
||||
|
@ -109,6 +119,7 @@ def _exec_ipmitool(driver_info, command):
|
|||
'lanplus',
|
||||
'-H',
|
||||
driver_info['address'],
|
||||
'-L', driver_info.get('priv_level')
|
||||
]
|
||||
|
||||
if driver_info['username']:
|
||||
|
|
|
@ -72,6 +72,11 @@ class IPMIToolPrivateMethodTestCase(base.TestCase):
|
|||
|
||||
info = dict(INFO_DICT)
|
||||
|
||||
# test the default value for 'priv_level'
|
||||
node = db_utils.get_test_node(driver_info=info)
|
||||
ret = ipmi._parse_driver_info(node)
|
||||
self.assertEqual('ADMINISTRATOR', ret['priv_level'])
|
||||
|
||||
# ipmi_username / ipmi_password are not mandatory
|
||||
del info['ipmi_username']
|
||||
node = db_utils.get_test_node(driver_info=info)
|
||||
|
@ -87,6 +92,13 @@ class IPMIToolPrivateMethodTestCase(base.TestCase):
|
|||
ipmi._parse_driver_info,
|
||||
node)
|
||||
|
||||
# test the invalid priv_level value
|
||||
self.info['priv_level'] = 'ABCD'
|
||||
node = db_utils.get_test_node(driver_info=info)
|
||||
self.assertRaises(exception.InvalidParameterValue,
|
||||
ipmi._parse_driver_info,
|
||||
node)
|
||||
|
||||
def test__exec_ipmitool(self):
|
||||
pw_file_handle = tempfile.NamedTemporaryFile()
|
||||
pw_file = pw_file_handle.name
|
||||
|
@ -95,6 +107,7 @@ class IPMIToolPrivateMethodTestCase(base.TestCase):
|
|||
'ipmitool',
|
||||
'-I', 'lanplus',
|
||||
'-H', self.info['address'],
|
||||
'-L', self.info['priv_level'],
|
||||
'-U', self.info['username'],
|
||||
'-f', file_handle,
|
||||
'A', 'B', 'C',
|
||||
|
@ -121,6 +134,7 @@ class IPMIToolPrivateMethodTestCase(base.TestCase):
|
|||
'ipmitool',
|
||||
'-I', 'lanplus',
|
||||
'-H', self.info['address'],
|
||||
'-L', self.info['priv_level'],
|
||||
'-U', self.info['username'],
|
||||
'-f', file_handle,
|
||||
'A', 'B', 'C',
|
||||
|
@ -145,6 +159,7 @@ class IPMIToolPrivateMethodTestCase(base.TestCase):
|
|||
'ipmitool',
|
||||
'-I', 'lanplus',
|
||||
'-H', self.info['address'],
|
||||
'-L', self.info['priv_level'],
|
||||
'-f', file_handle,
|
||||
'A', 'B', 'C',
|
||||
]
|
||||
|
@ -167,6 +182,7 @@ class IPMIToolPrivateMethodTestCase(base.TestCase):
|
|||
'ipmitool',
|
||||
'-I', 'lanplus',
|
||||
'-H', self.info['address'],
|
||||
'-L', self.info['priv_level'],
|
||||
'-U', self.info['username'],
|
||||
'-f', file_handle,
|
||||
'A', 'B', 'C',
|
||||
|
|
Loading…
Reference in New Issue