|  | # Copyright 2012 OpenStack Foundation | 
|  | # All Rights Reserved. | 
|  | # | 
|  | #    Licensed under the Apache License, Version 2.0 (the "License"); you may | 
|  | #    not use this file except in compliance with the License. You may obtain | 
|  | #    a copy of the License at | 
|  | # | 
|  | #         http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | #    Unless required by applicable law or agreed to in writing, software | 
|  | #    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | 
|  | #    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | 
|  | #    License for the specific language governing permissions and limitations | 
|  | #    under the License. | 
|  |  | 
|  | from tempest.lib import exceptions | 
|  |  | 
|  | from neutron_tempest_plugin.common import utils | 
|  |  | 
|  |  | 
|  | class NeutronTempestPluginException(exceptions.TempestException): | 
|  |  | 
|  | def __init__(self, **kwargs): | 
|  | super(NeutronTempestPluginException, self).__init__(**kwargs) | 
|  | self._properties = kwargs | 
|  |  | 
|  | def __getattr__(self, name): | 
|  | try: | 
|  | return self._properties[name] | 
|  | except KeyError: | 
|  | pass | 
|  |  | 
|  | msg = ("AttributeError: {!r} object has no attribute {!r}").format( | 
|  | self, name) | 
|  | raise AttributeError(msg) | 
|  |  | 
|  |  | 
|  | class InvalidConfiguration(NeutronTempestPluginException): | 
|  | message = "Invalid Configuration" | 
|  |  | 
|  |  | 
|  | class InvalidCredentials(NeutronTempestPluginException): | 
|  | message = "Invalid Credentials" | 
|  |  | 
|  |  | 
|  | class InvalidServiceTag(NeutronTempestPluginException): | 
|  | message = "Invalid service tag" | 
|  |  | 
|  |  | 
|  | class SSHScriptException(exceptions.TempestException): | 
|  | """Base class for SSH client execute_script() exceptions""" | 
|  |  | 
|  |  | 
|  | class ShellError(NeutronTempestPluginException): | 
|  | pass | 
|  |  | 
|  |  | 
|  | class ShellCommandFailed(ShellError): | 
|  | """Raised when shell command exited with non-zero status | 
|  |  | 
|  | """ | 
|  | message = ("Command %(command)r failed, exit status: %(exit_status)d, " | 
|  | "stderr:\n%(stderr)s\n" | 
|  | "stdout:\n%(stdout)s") | 
|  |  | 
|  |  | 
|  | class SSHScriptFailed(ShellCommandFailed): | 
|  | message = ("Command %(command)r failed, exit status: %(exit_status)d, " | 
|  | "host: %(host)r\n" | 
|  | "script:\n%(script)s\n" | 
|  | "stderr:\n%(stderr)s\n" | 
|  | "stdout:\n%(stdout)s") | 
|  |  | 
|  |  | 
|  | class ShellTimeoutExpired(ShellError): | 
|  | """Raised when shell command timeouts and has been killed before exiting | 
|  |  | 
|  | """ | 
|  | message = ("Command '%(command)s' timed out: %(timeout)d, " | 
|  | "stderr:\n%(stderr)s\n" | 
|  | "stdout:\n%(stdout)s") | 
|  |  | 
|  |  | 
|  | class SSHScriptTimeoutExpired(ShellTimeoutExpired): | 
|  | message = ("Command '%(command)s', timed out: %(timeout)d " | 
|  | "host: %(host)r\n" | 
|  | "script:\n%(script)s\n" | 
|  | "stderr:\n%(stderr)s\n" | 
|  | "stdout:\n%(stdout)s") | 
|  |  | 
|  |  | 
|  | # Patch SSHExecCommandFailed exception to make sure we can access to fields | 
|  | # command, exit_status, STDOUT and STDERR when SSH client reports command | 
|  | # failure | 
|  | exceptions.SSHExecCommandFailed = utils.override_class( | 
|  | exceptions.SSHExecCommandFailed, ShellCommandFailed) | 
|  |  | 
|  | # Above code created a new SSHExecCommandFailed class based on top | 
|  | # of ShellCommandError | 
|  | assert issubclass(exceptions.SSHExecCommandFailed, ShellCommandFailed) |