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:
Haomeng, Wang 2014-02-14 19:27:59 +08:00
parent 6a1c153de6
commit 44781dbacd
2 changed files with 28 additions and 1 deletions

View File

@ -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']:

View File

@ -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',