diff --git a/monikerclient/cli/base.py b/monikerclient/cli/base.py index 9c6690d0..5c65c1fb 100644 --- a/monikerclient/cli/base.py +++ b/monikerclient/cli/base.py @@ -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) diff --git a/monikerclient/exceptions.py b/monikerclient/exceptions.py index 1e0a9fdd..6d276cc8 100644 --- a/monikerclient/exceptions.py +++ b/monikerclient/exceptions.py @@ -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): diff --git a/monikerclient/shell.py b/monikerclient/shell.py index d9d7ee42..42a9e476 100644 --- a/monikerclient/shell.py +++ b/monikerclient/shell.py @@ -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) diff --git a/monikerclient/v1/__init__.py b/monikerclient/v1/__init__.py index 7ea8d1ad..eb24f3a6 100644 --- a/monikerclient/v1/__init__.py +++ b/monikerclient/v1/__init__.py @@ -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