Clean error message display :)

Change-Id: Ie74e590c7d9c9de0b5a22ca5185c3cd5438a50cb
This commit is contained in:
Kiall Mac Innes 2013-03-26 17:16:07 +00:00
parent 1e47b5a369
commit 2b97f4560c
4 changed files with 53 additions and 9 deletions

@ -17,6 +17,7 @@ import abc
from cliff.command import Command as CliffCommand
from cliff.lister import Lister
from cliff.show import ShowOne
from monikerclient import exceptions
from monikerclient import utils
from monikerclient.v1 import Client
@ -44,7 +45,30 @@ class Command(CliffCommand):
self.client = Client(**client_args)
return super(Command, self).run(parsed_args)
try:
return super(Command, self).run(parsed_args)
except exceptions.RemoteError, e:
columns = ['Code', 'Type']
values = [e.code, e.type]
if e.message:
columns.append('Message')
values.append(e.message)
if e.errors:
columns.append('Errors')
values.append(e.errors)
self.error_output(parsed_args, columns, values)
return 1
def error_output(self, parsed_args, column_names, data):
self.formatter.emit_one(column_names,
data,
self.app.stdout,
parsed_args)
self.app.log.error('The requested action did not complete sucessfully')
@abc.abstractmethod
def execute(self, parsed_args):
@ -66,7 +90,6 @@ class Command(CliffCommand):
return data
def take_action(self, parsed_args):
# TODO: Common Exception Handling Here
results = self.execute(parsed_args)
return self.post_execute(results)

@ -24,7 +24,13 @@ class ResourceNotFound(Base):
class RemoteError(Base):
pass
def __init__(self, message=None, code=None, type=None, errors=None):
super(RemoteError, self).__init__(message)
self.message = message
self.code = code
self.type = type
self.errors = errors
class Unknown(RemoteError):

@ -13,6 +13,7 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import logging
import os
from cliff.app import App
from cliff.commandmanager import CommandManager
@ -20,6 +21,8 @@ from monikerclient.version import version_info as version
class MonikerShell(App):
CONSOLE_MESSAGE_FORMAT = '%(levelname)s: %(message)s'
def __init__(self):
super(MonikerShell, self).__init__(
description='Moniker Client',
@ -27,6 +30,19 @@ class MonikerShell(App):
command_manager=CommandManager('moniker.cli'),
)
self.log = logging.getLogger(__name__)
def configure_logging(self):
super(MonikerShell, self).configure_logging()
# Set requests logging
requests_logger = logging.getLogger('requests')
if self.options.verbose_level <= 1:
requests_logger.setLevel(logging.WARN)
else:
requests_logger.setLevel(logging.DEBUG)
def build_option_parser(self, description, version):
parser = super(MonikerShell, self).build_option_parser(
description, version)

@ -52,7 +52,6 @@ class Client(object):
raise ValueError('Either an endpoint or auth_url must be supplied')
headers = {'Content-Type': 'application/json'}
self.requests = requests.Session()
self.requests.auth = auth
self.requests.headers.update(headers)
@ -76,15 +75,15 @@ class Client(object):
response = func(*args, **kw)
if response.status_code == 400:
raise exceptions.BadRequest(response.json['errors'])
raise exceptions.BadRequest(**response.json)
elif response.status_code in (401, 403):
raise exceptions.Forbidden()
raise exceptions.Forbidden(**response.json)
elif response.status_code == 404:
raise exceptions.NotFound()
raise exceptions.NotFound(**response.json)
elif response.status_code == 409:
raise exceptions.Conflict()
raise exceptions.Conflict(**response.json)
elif response.status_code == 500:
raise exceptions.Unknown()
raise exceptions.Unknown(**response.json)
else:
return response