def _run_dog(self, command, subcommand, *params): cmd = ('env', 'LC_ALL=C', 'LANG=C', 'dog', command, subcommand, '-a', self.addr, '-p', self.port) + params try: return utils.execute(*cmd) except OSError as e: with excutils.save_and_reraise_exception(): if e.errno == errno.ENOENT: msg = _LE('Sheepdog is not installed. ' 'OSError: command is %s.') else: msg = _LE('OSError: command is %s.') LOG.error(msg, cmd) except processutils.ProcessExecutionError as e: _stderr = e.stderr if _stderr.startswith(self.DOG_RESP_CONNECTION_ERROR): reason = (_('Failed to connect to sheep daemon. ' 'addr: %(addr)s, port: %(port)s'), { 'addr': self.addr, 'port': self.port }) raise exception.SheepdogError(reason=reason) raise exception.SheepdogCmdError( cmd=e.cmd, exit_code=e.exit_code, stdout=e.stdout.replace('\n', '\\n'), stderr=e.stderr.replace('\n', '\\n'))
def _run_qemu_img(self, command, *params): """Executes qemu-img command wrapper""" cmd = ['env', 'LC_ALL=C', 'LANG=C', 'qemu-img', command] for param in params: if param.startswith(self.QEMU_SHEEPDOG_PREFIX): # replace 'sheepdog:vdiname[:snapshotname]' to # 'sheepdog:addr:port:vdiname[:snapshotname]' param = param.replace( self.QEMU_SHEEPDOG_PREFIX, '%(prefix)s%(addr)s:%(port)s:' % { 'prefix': self.QEMU_SHEEPDOG_PREFIX, 'addr': self.addr, 'port': self.port }, 1) cmd.append(param) try: return utils.execute(*cmd) except OSError as e: with excutils.save_and_reraise_exception(): if e.errno == errno.ENOENT: msg = _LE('Qemu-img is not installed. ' 'OSError: command is %(cmd)s.') else: msg = _LE('OSError: command is %(cmd)s.') LOG.error(msg, {'cmd': tuple(cmd)}) except processutils.ProcessExecutionError as e: raise exception.SheepdogCmdError( cmd=e.cmd, exit_code=e.exit_code, stdout=e.stdout.replace('\n', '\\n'), stderr=e.stderr.replace('\n', '\\n'))
def test_create_unknown_error(self, fake_logger, fake_execute): cmd = self.test_data.cmd_dog_vdi_create(self._vdiname, self._vdisize) exit_code = 1 stdout = 'stdout_dummy' stderr = 'stderr_dummy' expected_msg = self.test_data.sheepdog_cmd_error( cmd=cmd, exit_code=exit_code, stdout=stdout, stderr=stderr) fake_execute.side_effect = exception.SheepdogCmdError( cmd=cmd, exit_code=exit_code, stdout=stdout.replace('\n', '\\n'), stderr=stderr.replace('\n', '\\n')) ex = self.assertRaises(exception.SheepdogCmdError, self.client.create, self._vdiname, self._vdisize) self.assertTrue(fake_logger.error.called) self.assertEqual(expected_msg, ex.msg)
def test_create_fail_to_connect(self, fake_logger, fake_execute): cmd = self.test_data.cmd_dog_vdi_create(self._vdiname, self._vdisize) exit_code = 2 stdout = '' stderr = self.test_data.DOG_COMMAND_ERROR_FAIL_TO_CONNECT expected_msg = self.test_data.sheepdog_cmd_error( cmd=cmd, exit_code=exit_code, stdout=stdout, stderr=stderr) fake_execute.side_effect = exception.SheepdogCmdError( cmd=cmd, exit_code=exit_code, stdout=stdout.replace('\n', '\\n'), stderr=stderr.replace('\n', '\\n')) ex = self.assertRaises(exception.SheepdogCmdError, self.client.create, self._vdiname, self._vdisize) self.assertTrue(fake_logger.error.called) self.assertEqual(expected_msg, ex.msg)
def test_create_vdi_already_exists(self, fake_logger, fake_execute): cmd = self.test_data.cmd_dog_vdi_create(self._vdiname, self._vdisize) exit_code = 1 stdout = '' stderr = (self.test_data.DOG_VDI_CREATE_VDI_ALREADY_EXISTS % {'vdiname': self._vdiname}) expected_msg = self.test_data.sheepdog_cmd_error( cmd=cmd, exit_code=exit_code, stdout=stdout, stderr=stderr) fake_execute.side_effect = exception.SheepdogCmdError( cmd=cmd, exit_code=exit_code, stdout=stdout.replace('\n', '\\n'), stderr=stderr.replace('\n', '\\n')) ex = self.assertRaises(exception.SheepdogCmdError, self.client.create, self._vdiname, self._vdisize) self.assertTrue(fake_logger.error.called) self.assertEqual(expected_msg, ex.msg)
def test_check_cluster_status_unknown_error(self, fake_logger, fake_execute): cmd = self.test_data.CMD_DOG_CLUSTER_INFO exit_code = 2 stdout = 'stdout_dummy' stderr = 'stdout_dummy' expected_msg = self.test_data.sheepdog_cmd_error(cmd=cmd, exit_code=exit_code, stdout=stdout, stderr=stderr) fake_execute.side_effect = exception.SheepdogCmdError( cmd=cmd, exit_code=exit_code, stdout=stdout, stderr=stderr) ex = self.assertRaises(exception.SheepdogCmdError, self.client.check_cluster_status) self.assertEqual(expected_msg, ex.msg)
def test_check_cluster_status_fail_to_connect(self, fake_logger, fake_execute): cmd = self.test_data.CMD_DOG_CLUSTER_INFO exit_code = 2 stdout = 'stdout_dummy' stderr = self.test_data.DOG_COMMAND_ERROR_FAIL_TO_CONNECT expected_msg = self.test_data.sheepdog_cmd_error(cmd=cmd, exit_code=exit_code, stdout=stdout, stderr=stderr) fake_execute.side_effect = exception.SheepdogCmdError( cmd=cmd, exit_code=exit_code, stdout=stdout.replace('\n', '\\n'), stderr=stderr.replace('\n', '\\n')) ex = self.assertRaises(exception.SheepdogCmdError, self.client.check_cluster_status) self.assertEqual(expected_msg, ex.msg) self.assertTrue(fake_logger.error.called)
def _run_dog(self, command, subcommand, *params): """Execute dog command wrapper.""" addr = self.get_addr() cmd = ('env', 'LC_ALL=C', 'LANG=C', 'dog', command, subcommand, '-a', addr, '-p', self.port) + params try: (_stdout, _stderr) = utils.execute(*cmd) if _stderr.startswith(self.DOG_RESP_CONNECTION_ERROR): # NOTE(tishizaki) # Dog command does not return error_code although # dog command cannot connect to sheep process. # That is a Sheepdog's bug. # To avoid a Sheepdog's bug, now we need to check stderr. # If Sheepdog has been fixed, this check logic is needed # by old Sheepdog users. reason = (_('Failed to connect to sheep daemon. ' 'addr: %(addr)s, port: %(port)s'), { 'addr': addr, 'port': self.port }) raise exception.SheepdogError(reason=reason) return (_stdout, _stderr) except OSError as e: with excutils.save_and_reraise_exception(): if e.errno == errno.ENOENT: msg = _LE('Sheepdog is not installed. ' 'OSError: command is %s.') else: msg = _LE('OSError: command is %s.') LOG.error(msg, cmd) except processutils.ProcessExecutionError as e: _stderr = e.stderr if _stderr.startswith(self.DOG_RESP_CONNECTION_ERROR): reason = (_('Failed to connect to sheep daemon. ' 'addr: %(addr)s, port: %(port)s'), { 'addr': addr, 'port': self.port }) raise exception.SheepdogError(reason=reason) raise exception.SheepdogCmdError( cmd=e.cmd, exit_code=e.exit_code, stdout=e.stdout.replace('\n', '\\n'), stderr=e.stderr.replace('\n', '\\n'))
def _run_dog(self, command, subcommand, *params): cmd = ('env', 'LC_ALL=C', 'LANG=C', 'dog', command, subcommand, '-a', self.addr, '-p', self.port) + params try: return utils.execute(*cmd) except OSError as e: with excutils.save_and_reraise_exception(): if e.errno == errno.ENOENT: msg = _LE('Sheepdog is not installed. ' 'OSError: command is %s.') else: msg = _LE('OSError: command is %s.') LOG.error(msg, cmd) except processutils.ProcessExecutionError as e: raise exception.SheepdogCmdError( cmd=e.cmd, exit_code=e.exit_code, stdout=e.stdout.replace('\n', '\\n'), stderr=e.stderr.replace('\n', '\\n'))
def _run_qemu_img(self, command, *params): """Executes qemu-img command wrapper.""" addr = self.get_addr() cmd = ['env', 'LC_ALL=C', 'LANG=C', 'qemu-img', command] for param in params: if param.startswith(self.QEMU_SHEEPDOG_PREFIX): # replace 'sheepdog:vdiname[:snapshotname]' to # 'sheepdog:addr:port:vdiname[:snapshotname]' param = param.replace( self.QEMU_SHEEPDOG_PREFIX, '%(prefix)s%(addr)s:%(port)s:' % { 'prefix': self.QEMU_SHEEPDOG_PREFIX, 'addr': addr, 'port': self.port }, 1) cmd.append(param) try: return utils.execute(*cmd) except OSError as e: with excutils.save_and_reraise_exception(): if e.errno == errno.ENOENT: msg = ('Qemu-img is not installed. OSError: command is ' '%(cmd)s.') else: msg = 'OSError: command is %(cmd)s.' LOG.error(msg, {'cmd': tuple(cmd)}) except processutils.ProcessExecutionError as e: _stderr = e.stderr if self.QEMU_IMG_RESP_CONNECTION_ERROR in _stderr: reason = (_('Failed to connect to sheep daemon. ' 'addr: %(addr)s, port: %(port)s'), { 'addr': addr, 'port': self.port }) raise exception.SheepdogError(reason=reason) raise exception.SheepdogCmdError( cmd=e.cmd, exit_code=e.exit_code, stdout=e.stdout.replace('\n', '\\n'), stderr=e.stderr.replace('\n', '\\n'))