def test__exec_ipmitool_first_call_to_address(self, mock_exec, mock_pwf, mock_timing_support, mock_sleep): ipmi.LAST_CMD_TIME = {} pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ "ipmitool", "-I", "lanplus", "-H", self.info["address"], "-L", self.info["priv_level"], "-U", self.info["username"], "-f", file_handle, "A", "B", "C", ] mock_timing_support.return_value = False mock_pwf.return_value = file_handle mock_exec.return_value = (None, None) ipmi._exec_ipmitool(self.info, "A B C") mock_pwf.assert_called_once_with(self.info["password"]) mock_exec.assert_called_once_with(*args) self.assertFalse(mock_sleep.called)
def _issue_bmc_reset(self, driver_info, task): """ Issues a bmc reset and waits till the BMC is ready for servicing """ cmd = 'bmc reset cold' node_uuid = task.node.uuid self.log.debug("Issuing bmc cold reset to node %s" %(task.node.name)) try: out, err = ipmitool._exec_ipmitool(driver_info, cmd) self.log.debug('bmc reset returned stdout: %(stdout)s, stderr:' ' %(stderr)s', {'stdout': out, 'stderr': err}) except processutils.ProcessExecutionError as err: self.log.exception(_translators.log_error('IPMI "bmc reset" failed for node %(node_id)s ' 'with error: %(error)s.'), {'node_id': node_uuid, 'error': err}) raise exception.IPMIFailure(cmd=cmd) sleep_count = 10 cmd = 'bmc info' while sleep_count: try: out, err = ipmitool._exec_ipmitool(driver_info, cmd) self.log.debug('bmc reset returned stdout: %(stdout)s, stderr:' ' %(stderr)s', {'stdout': out, 'stderr': err}) break except processutils.ProcessExecutionError as err: self.log.debug(_translators.log_error('IPMI "bmc info" failed for node %(node_id)s ' 'with error: %(error)s. Sleeping and retrying later.' 'sleep_count: %(sleep_count)s'), {'node_id': node_uuid, 'error': err, 'sleep_count': sleep_count}) time.sleep(10) sleep_count -= 1 if not sleep_count: self.log.exception('After bmc reset, connection to bmc is lost!') raise exception.IPMIFailure(cmd='bmc reset')
def test__exec_ipmitool(self, mock_exec, mock_pwf): pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle, 'A', 'B', 'C', ] mock_pwf.return_value = file_handle mock_exec.return_value = (None, None) ipmi._exec_ipmitool(self.info, 'A B C') mock_pwf.assert_called_once_with(self.info['password']) mock_exec.assert_called_once_with(*args, attempts=3)
def test__exec_ipmitool(self): pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle, 'A', 'B', 'C', ] with mock.patch.object(ipmi, '_make_password_file', autospec=True) as mock_pwf: mock_pwf.return_value = file_handle with mock.patch.object(utils, 'execute', autospec=True) as mock_exec: mock_exec.return_value = (None, None) ipmi._exec_ipmitool(self.info, 'A B C') mock_pwf.assert_called_once_with(self.info['password']) mock_exec.assert_called_once_with(*args, attempts=3)
def test__exec_ipmitool_without_username(self, mock_exec, mock_pwf, mock_timing_support, mock_sleep): self.info['username'] = None pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-f', file_handle, 'A', 'B', 'C', ] mock_timing_support.return_value = False mock_pwf.return_value = file_handle mock_exec.return_value = (None, None) ipmi._exec_ipmitool(self.info, 'A B C') self.assertTrue(mock_pwf.called) mock_exec.assert_called_once_with(*args)
def test__exec_ipmitool_with_timing(self, mock_exec, mock_pwf, mock_timing_support, mock_sleep): pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-R', '12', '-N', '5', '-f', file_handle, 'A', 'B', 'C', ] mock_timing_support.return_value = True mock_pwf.return_value = file_handle mock_exec.return_value = (None, None) ipmi._exec_ipmitool(self.info, 'A B C') mock_pwf.assert_called_once_with(self.info['password']) mock_exec.assert_called_once_with(*args)
def test__exec_ipmitool_first_call_to_address(self, mock_exec, mock_pwf, mock_timing_support, mock_sleep): ipmi.LAST_CMD_TIME = {} pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle, 'A', 'B', 'C', ] mock_timing_support.return_value = False mock_pwf.return_value = file_handle mock_exec.return_value = (None, None) ipmi._exec_ipmitool(self.info, 'A B C') mock_pwf.assert_called_once_with(self.info['password']) mock_exec.assert_called_once_with(*args) self.assertFalse(mock_sleep.called)
def test__exec_ipmitool_without_username(self, mock_exec, mock_pwf, mock_timing_support, mock_sleep): self.info["username"] = None pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ "ipmitool", "-I", "lanplus", "-H", self.info["address"], "-L", self.info["priv_level"], "-f", file_handle, "A", "B", "C", ] mock_timing_support.return_value = False mock_pwf.return_value = file_handle mock_exec.return_value = (None, None) ipmi._exec_ipmitool(self.info, "A B C") self.assertTrue(mock_pwf.called) mock_exec.assert_called_once_with(*args)
def test__exec_ipmitool(self): pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle, 'A', 'B', 'C', ] with mock.patch.object(ipmi, '_make_password_file', autospec=True) as mock_pwf: mock_pwf.return_value = file_handle with mock.patch.object(utils, 'execute', autospec=True) as mock_exec: mock_exec.return_value = (None, None) ipmi._exec_ipmitool(self.info, 'A B C') mock_pwf.assert_called_once_with(self.info['password']) mock_exec.assert_called_once_with(*args, attempts=3)
def test__exec_ipmitool_first_call_to_address(self, mock_exec, mock_pwf, mock_timing_support, mock_sleep): ipmi.LAST_CMD_TIME = {} pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle, 'A', 'B', 'C', ] mock_timing_support.return_value = False mock_pwf.return_value = file_handle mock_exec.return_value = (None, None) ipmi._exec_ipmitool(self.info, 'A B C') mock_pwf.assert_called_once_with(self.info['password']) mock_exec.assert_called_once_with(*args) self.assertFalse(mock_sleep.called)
def test__power_status_error(self): self.mox.StubOutWithMock(ipmi, '_exec_ipmitool') ipmi._exec_ipmitool(self.info, "power status").AndReturn( ["Chassis Power is badstate\n", None]) self.mox.ReplayAll() state = ipmi._power_status(self.info) self.mox.VerifyAll() self.assertEqual(state, states.ERROR)
def test_set_boot_device_ok(self): self.mox.StubOutWithMock(ipmi, '_exec_ipmitool') ipmi._exec_ipmitool(self.info, "chassis bootdev pxe").\ AndReturn([None, None]) self.mox.ReplayAll() with task_manager.acquire([self.node['uuid']]) as task: self.driver.power._set_boot_device(task, self.node, 'pxe') self.mox.VerifyAll()
def test__exec_ipmitool_second_call_to_address_no_sleep(self, mock_exec, mock_pwf, mock_timing_support, mock_sleep): ipmi.LAST_CMD_TIME = {} pw_file_handle1 = tempfile.NamedTemporaryFile() pw_file1 = pw_file_handle1.name file_handle1 = open(pw_file1, "w") pw_file_handle2 = tempfile.NamedTemporaryFile() pw_file2 = pw_file_handle2.name file_handle2 = open(pw_file2, "w") args = [ [ "ipmitool", "-I", "lanplus", "-H", self.info["address"], "-L", self.info["priv_level"], "-U", self.info["username"], "-f", file_handle1, "A", "B", "C", ], [ "ipmitool", "-I", "lanplus", "-H", self.info["address"], "-L", self.info["priv_level"], "-U", self.info["username"], "-f", file_handle2, "D", "E", "F", ], ] mock_timing_support.return_value = False mock_pwf.side_effect = iter([file_handle1, file_handle2]) mock_exec.side_effect = iter([(None, None), (None, None)]) ipmi._exec_ipmitool(self.info, "A B C") mock_exec.assert_called_with(*args[0]) # act like enough time has passed ipmi.LAST_CMD_TIME[self.info["address"]] = time.time() - CONF.ipmi.min_command_interval ipmi._exec_ipmitool(self.info, "D E F") self.assertFalse(mock_sleep.called) mock_exec.assert_called_with(*args[1])
def test__exec_ipmitool_two_calls_to_diff_address(self, mock_exec, mock_pwf, mock_timing_support, mock_sleep): ipmi.LAST_CMD_TIME = {} pw_file_handle1 = tempfile.NamedTemporaryFile() pw_file1 = pw_file_handle1.name file_handle1 = open(pw_file1, "w") pw_file_handle2 = tempfile.NamedTemporaryFile() pw_file2 = pw_file_handle2.name file_handle2 = open(pw_file2, "w") args = [[ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle1, 'A', 'B', 'C', ], [ 'ipmitool', '-I', 'lanplus', '-H', '127.127.127.127', '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle2, 'D', 'E', 'F', ]] mock_timing_support.return_value = False mock_pwf.side_effect = iter([file_handle1, file_handle2]) mock_exec.side_effect = iter([(None, None), (None, None)]) ipmi._exec_ipmitool(self.info, 'A B C') mock_exec.assert_called_with(*args[0]) self.info['address'] = '127.127.127.127' ipmi._exec_ipmitool(self.info, 'D E F') self.assertFalse(mock_sleep.called) mock_exec.assert_called_with(*args[1])
def test__exec_ipmitool_second_call_to_address_no_sleep( self, mock_exec, mock_pwf, mock_timing_support, mock_sleep): ipmi.LAST_CMD_TIME = {} pw_file_handle1 = tempfile.NamedTemporaryFile() pw_file1 = pw_file_handle1.name file_handle1 = open(pw_file1, "w") pw_file_handle2 = tempfile.NamedTemporaryFile() pw_file2 = pw_file_handle2.name file_handle2 = open(pw_file2, "w") args = [[ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle1, 'A', 'B', 'C', ], [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle2, 'D', 'E', 'F', ]] mock_timing_support.return_value = False mock_pwf.side_effect = iter([file_handle1, file_handle2]) mock_exec.side_effect = iter([(None, None), (None, None)]) ipmi._exec_ipmitool(self.info, 'A B C') mock_exec.assert_called_with(*args[0]) # act like enough time has passed ipmi.LAST_CMD_TIME[self.info['address']] = ( time.time() - CONF.ipmi.min_command_interval) ipmi._exec_ipmitool(self.info, 'D E F') self.assertFalse(mock_sleep.called) mock_exec.assert_called_with(*args[1])
def test__exec_ipmitool_two_calls_to_diff_address(self, mock_exec, mock_pwf, mock_timing_support, mock_sleep): ipmi.LAST_CMD_TIME = {} pw_file_handle1 = tempfile.NamedTemporaryFile() pw_file1 = pw_file_handle1.name file_handle1 = open(pw_file1, "w") pw_file_handle2 = tempfile.NamedTemporaryFile() pw_file2 = pw_file_handle2.name file_handle2 = open(pw_file2, "w") args = [ [ "ipmitool", "-I", "lanplus", "-H", self.info["address"], "-L", self.info["priv_level"], "-U", self.info["username"], "-f", file_handle1, "A", "B", "C", ], [ "ipmitool", "-I", "lanplus", "-H", "127.127.127.127", "-L", self.info["priv_level"], "-U", self.info["username"], "-f", file_handle2, "D", "E", "F", ], ] mock_timing_support.return_value = False mock_pwf.side_effect = iter([file_handle1, file_handle2]) mock_exec.side_effect = iter([(None, None), (None, None)]) ipmi._exec_ipmitool(self.info, "A B C") mock_exec.assert_called_with(*args[0]) self.info["address"] = "127.127.127.127" ipmi._exec_ipmitool(self.info, "D E F") self.assertFalse(mock_sleep.called) mock_exec.assert_called_with(*args[1])
def send_raw(task, raw_bytes): """Send raw bytes to the BMC. Bytes should be a string of bytes. :param task: a TaskManager instance. :param raw_bytes: a string of raw bytes to send, e.g. '0x00 0x01' :returns: a tuple with stdout and stderr. :raises: IPMIFailure on an error from ipmitool. :raises: MissingParameterValue if a required parameter is missing. :raises: InvalidParameterValue when an invalid value is specified. """ node_uuid = task.node.uuid LOG.debug('Sending node %(node)s raw bytes %(bytes)s', {'bytes': raw_bytes, 'node': node_uuid}) driver_info = ipmitool._parse_driver_info(task.node) cmd = 'raw %s' % raw_bytes try: out, err = ipmitool._exec_ipmitool(driver_info, cmd) LOG.debug('send raw bytes returned stdout: %(stdout)s, stderr:' ' %(stderr)s', {'stdout': out, 'stderr': err}) except (exception.PasswordFileFailedToCreate, processutils.ProcessExecutionError) as e: LOG.exception(_LE('IPMI "raw bytes" failed for node %(node_id)s ' 'with error: %(error)s.'), {'node_id': node_uuid, 'error': e}) raise exception.IPMIFailure(cmd=cmd) return out, err
def dump_sdr(task, file_path): """Dump SDR data to a file. :param task: a TaskManager instance. :param file_path: the path to SDR dump file. :raises: IPMIFailure on an error from ipmitool. :raises: MissingParameterValue if a required parameter is missing. :raises: InvalidParameterValue when an invalid value is specified. """ node_uuid = task.node.uuid LOG.debug('Dump SDR data for node %(node)s to file %(name)s', {'name': file_path, 'node': node_uuid}) driver_info = ipmitool._parse_driver_info(task.node) cmd = 'sdr dump %s' % file_path try: out, err = ipmitool._exec_ipmitool(driver_info, cmd) LOG.debug('dump SDR returned stdout: %(stdout)s, stderr:' ' %(stderr)s', {'stdout': out, 'stderr': err}) except (exception.PasswordFileFailedToCreate, processutils.ProcessExecutionError) as e: LOG.exception(_LE('IPMI "sdr dump" failed for node %(node_id)s ' 'with error: %(error)s.'), {'node_id': node_uuid, 'error': e}) raise exception.IPMIFailure(cmd=cmd)
def test__exec_ipmitool_without_username(self, mock_exec, mock_pwf): self.info['username'] = None pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-f', file_handle, 'A', 'B', 'C', ] mock_pwf.return_value = file_handle mock_exec.return_value = (None, None) ipmi._exec_ipmitool(self.info, 'A B C') self.assertTrue(mock_pwf.called) mock_exec.assert_called_once_with(*args, attempts=3)
def test__exec_ipmitool(self): pw_file = '/tmp/password_file' file_handle = open(pw_file, "w") self.mox.StubOutWithMock(ipmi, '_make_password_file') self.mox.StubOutWithMock(utils, 'execute') args = [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-U', self.info['username'], '-f', file_handle, 'A', 'B', 'C', ] ipmi._make_password_file(self.info['password']).AndReturn(file_handle) utils.execute(*args, attempts=3).AndReturn((None, None)) self.mox.ReplayAll() ipmi._exec_ipmitool(self.info, 'A B C') self.mox.VerifyAll()
def test__exec_ipmitool_second_call_to_address_no_sleep(self, mock_exec, mock_pwf, mock_timing_support, mock_sleep): ipmi.LAST_CMD_TIME = {} pw_file_handle1 = tempfile.NamedTemporaryFile() pw_file1 = pw_file_handle1.name file_handle1 = open(pw_file1, "w") pw_file_handle2 = tempfile.NamedTemporaryFile() pw_file2 = pw_file_handle2.name file_handle2 = open(pw_file2, "w") args = [[ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle1, 'A', 'B', 'C', ], [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle2, 'D', 'E', 'F', ]] mock_timing_support.return_value = False mock_pwf.side_effect = iter([file_handle1, file_handle2]) mock_exec.side_effect = iter([(None, None), (None, None)]) ipmi._exec_ipmitool(self.info, 'A B C') mock_exec.assert_called_with(*args[0]) # act like enough time has passed ipmi.LAST_CMD_TIME[self.info['address']] = (time.time() - CONF.ipmi.min_command_interval) ipmi._exec_ipmitool(self.info, 'D E F') self.assertFalse(mock_sleep.called) mock_exec.assert_called_with(*args[1])
def test__exec_ipmitool_two_calls_to_diff_address(self, mock_exec, mock_pwf, mock_timing_support, mock_sleep): ipmi.LAST_CMD_TIME = {} pw_file_handle1 = tempfile.NamedTemporaryFile() pw_file1 = pw_file_handle1.name file_handle1 = open(pw_file1, "w") pw_file_handle2 = tempfile.NamedTemporaryFile() pw_file2 = pw_file_handle2.name file_handle2 = open(pw_file2, "w") args = [[ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle1, 'A', 'B', 'C', ], [ 'ipmitool', '-I', 'lanplus', '-H', '127.127.127.127', '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle2, 'D', 'E', 'F', ]] mock_timing_support.return_value = False mock_pwf.side_effect = iter([file_handle1, file_handle2]) mock_exec.side_effect = iter([(None, None), (None, None)]) ipmi._exec_ipmitool(self.info, 'A B C') mock_exec.assert_called_with(*args[0]) self.info['address'] = '127.127.127.127' ipmi._exec_ipmitool(self.info, 'D E F') self.assertFalse(mock_sleep.called) mock_exec.assert_called_with(*args[1])
def test_get_power_state(self): self.mox.StubOutWithMock(ipmi, '_exec_ipmitool') ipmi._exec_ipmitool(self.info, "power status").AndReturn( ["Chassis Power is off\n", None]) ipmi._exec_ipmitool(self.info, "power status").AndReturn( ["Chassis Power is on\n", None]) ipmi._exec_ipmitool(self.info, "power status").AndReturn( ["\n", None]) self.mox.ReplayAll() pstate = self.driver.power.get_power_state(None, self.node) self.assertEqual(pstate, states.POWER_OFF) pstate = self.driver.power.get_power_state(None, self.node) self.assertEqual(pstate, states.POWER_ON) pstate = self.driver.power.get_power_state(None, self.node) self.assertEqual(pstate, states.ERROR) self.mox.VerifyAll()
def test__power_on_max_retries(self): self.config(ipmi_power_retry=2) self.mox.StubOutWithMock(ipmi, '_exec_ipmitool') ipmi._exec_ipmitool(self.info, "power status").AndReturn( ["Chassis Power is off\n", None]) ipmi._exec_ipmitool(self.info, "power on").AndReturn([None, None]) ipmi._exec_ipmitool(self.info, "power status").AndReturn( ["Chassis Power is off\n", None]) ipmi._exec_ipmitool(self.info, "power on").AndReturn([None, None]) ipmi._exec_ipmitool(self.info, "power status").AndReturn( ["Chassis Power is off\n", None]) ipmi._exec_ipmitool(self.info, "power on").AndReturn([None, None]) ipmi._exec_ipmitool(self.info, "power status").AndReturn( ["Chassis Power is off\n", None]) self.mox.ReplayAll() state = ipmi._power_on(self.info) self.mox.VerifyAll() self.assertEqual(state, states.ERROR)