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.command import Command as CliffCommand
from cliff.lister import Lister from cliff.lister import Lister
from cliff.show import ShowOne from cliff.show import ShowOne
from monikerclient import exceptions
from monikerclient import utils from monikerclient import utils
from monikerclient.v1 import Client from monikerclient.v1 import Client
@ -44,7 +45,30 @@ class Command(CliffCommand):
self.client = Client(**client_args) 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 @abc.abstractmethod
def execute(self, parsed_args): def execute(self, parsed_args):
@ -66,7 +90,6 @@ class Command(CliffCommand):
return data return data
def take_action(self, parsed_args): def take_action(self, parsed_args):
# TODO: Common Exception Handling Here
results = self.execute(parsed_args) results = self.execute(parsed_args)
return self.post_execute(results) return self.post_execute(results)

@ -24,7 +24,13 @@ class ResourceNotFound(Base):
class RemoteError(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): class Unknown(RemoteError):

@ -13,6 +13,7 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import logging
import os import os
from cliff.app import App from cliff.app import App
from cliff.commandmanager import CommandManager from cliff.commandmanager import CommandManager
@ -20,6 +21,8 @@ from monikerclient.version import version_info as version
class MonikerShell(App): class MonikerShell(App):
CONSOLE_MESSAGE_FORMAT = '%(levelname)s: %(message)s'
def __init__(self): def __init__(self):
super(MonikerShell, self).__init__( super(MonikerShell, self).__init__(
description='Moniker Client', description='Moniker Client',
@ -27,6 +30,19 @@ class MonikerShell(App):
command_manager=CommandManager('moniker.cli'), 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): def build_option_parser(self, description, version):
parser = super(MonikerShell, self).build_option_parser( parser = super(MonikerShell, self).build_option_parser(
description, version) description, version)

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