def test_exec_ssh_command_good(self): # stop mocking the processutils.ssh_execute because we # are testing it here self.ssh_patcher.stop() self.ssh_patcher = None class Channel(object): def recv_exit_status(self): return 0 class Stream(object): def __init__(self, buffer=''): self.buffer = buffer self.channel = Channel() def read(self): return self.buffer def close(self): pass with mock.patch.object(self.sshclient, 'exec_command') \ as exec_command_mock: exec_command_mock.return_value = (Stream(), Stream('hello'), Stream()) stdout, stderr = processutils.ssh_execute(self.sshclient, "command") self.assertEqual('hello', stdout) exec_command_mock.assert_called_once_with("command")
def test_exec_ssh_command_good(self): class Channel(object): def recv_exit_status(self): return 0 class Stream(object): def __init__(self, buffer=''): self.buffer = buffer self.channel = Channel() def read(self): return self.buffer def close(self): pass with mock.patch.object(self.sshclient, 'exec_command') \ as exec_command_mock: exec_command_mock.return_value = (Stream(), Stream('hello'), Stream()) stdout, stderr = processutils.ssh_execute(self.sshclient, "command") self.assertEqual('hello', stdout) exec_command_mock.assert_called_once_with("command")
def _get_power_status(ssh_obj, driver_info): """Returns a node's current power state.""" power_state = None cmd_to_exec = "%s %s" % (driver_info['cmd_set']['base_cmd'], driver_info['cmd_set']['list_running']) running_list = processutils.ssh_execute(ssh_obj, cmd_to_exec)[0].split('\n') # Command should return a list of running vms. If the current node is # not listed then we can assume it is not powered on. node_name = _get_hosts_name_for_node(ssh_obj, driver_info) if node_name: for node in running_list: if not node: continue if node_name in node: power_state = states.POWER_ON break if not power_state: power_state = states.POWER_OFF else: err_msg = _('Node "%(host)s" with MAC address %(mac)s not found.') LOG.error(err_msg, {'host': driver_info['host'], 'mac': driver_info['macs']}) raise exception.NodeNotFound(node=driver_info['host']) return power_state
def _power_off(ssh_obj, driver_info): """Power OFF this node.""" current_pstate = _get_power_status(ssh_obj, driver_info) if current_pstate == states.POWER_OFF: return current_pstate node_name = _get_hosts_name_for_node(ssh_obj, driver_info) cmd_to_power_off = "%s %s" % (driver_info['cmd_set']['base_cmd'], driver_info['cmd_set']['stop_cmd']) cmd_to_power_off = cmd_to_power_off.replace('{_NodeName_}', node_name) processutils.ssh_execute(ssh_obj, cmd_to_power_off) current_pstate = _get_power_status(ssh_obj, driver_info) if current_pstate == states.POWER_OFF: return current_pstate else: return states.ERROR
def _get_hosts_name_for_node(ssh_obj, driver_info): """Get the name the host uses to reference the node.""" matched_name = None cmd_to_exec = "%s %s" % (driver_info['cmd_set']['base_cmd'], driver_info['cmd_set']['list_all']) full_node_list = processutils.ssh_execute(ssh_obj, cmd_to_exec)[0].split('\n') LOG.debug(_("Retrieved Node List: %s") % repr(full_node_list)) # for each node check Mac Addresses for node in full_node_list: if not node: continue LOG.debug(_("Checking Node: %s's Mac address.") % node) cmd_to_exec = "%s %s" % (driver_info['cmd_set']['base_cmd'], driver_info['cmd_set']['get_node_macs']) cmd_to_exec = cmd_to_exec.replace('{_NodeName_}', node) hosts_node_mac_list = processutils.ssh_execute(ssh_obj, cmd_to_exec)[0].split('\n') for host_mac in hosts_node_mac_list: if not host_mac: continue for node_mac in driver_info['macs']: if not node_mac: continue if _normalize_mac(host_mac) in _normalize_mac(node_mac): LOG.debug(_("Found Mac address: %s") % node_mac) matched_name = node break if matched_name: break if matched_name: break return matched_name
def _ssh_execute(ssh_obj, cmd_to_exec): """Executes a command via ssh. Executes a command via ssh and returns a list of the lines of the output from the command. :param ssh_obj: paramiko.SSHClient, an active ssh connection. :param cmd_to_exec: command to execute. :returns: list of the lines of output from the command. :raises: SSHCommandFailed on an error from ssh. """ try: output_list = processutils.ssh_execute(ssh_obj, cmd_to_exec)[0].split("\n") except Exception as e: LOG.debug(_("Cannot execute SSH cmd %(cmd)s. Reason: %(err)s.") % {"cmd": cmd_to_exec, "err": e}) raise exception.SSHCommandFailed(cmd=cmd_to_exec) return output_list
def _ssh_execute(ssh_obj, cmd_to_exec): """Executes a command via ssh. Executes a command via ssh and returns a list of the lines of the output from the command. :param ssh_obj: paramiko.SSHClient, an active ssh connection. :param cmd_to_exec: command to execute. :returns: list of the lines of output from the command. :raises: SSHCommandFailed on an error from ssh. """ try: output_list = processutils.ssh_execute(ssh_obj, cmd_to_exec)[0].split('\n') except Exception as e: LOG.debug("Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." % {'cmd': cmd_to_exec, 'err': e}) raise exception.SSHCommandFailed(cmd=cmd_to_exec) return output_list
def test_exec_ssh_command_good(self): class Channel(object): def recv_exit_status(self): return 0 class Stream(object): def __init__(self, buffer=""): self.buffer = buffer self.channel = Channel() def read(self): return self.buffer def close(self): pass with mock.patch.object(self.sshclient, "exec_command") as exec_command_mock: exec_command_mock.return_value = (Stream(), Stream("hello"), Stream()) stdout, stderr = processutils.ssh_execute(self.sshclient, "command") self.assertEqual("hello", stdout) exec_command_mock.assert_called_once_with("command")