Error handling

All methods from proxy classes return [Munch](https://github.com/Infinidat/munch) with data only when the API call succeeds. Otherwise, an exception is raised.

This example code tries to cancel a build. Such thing is possible only when the build is not already finished.

from copr.v3 import Client
client = Client.create_from_config_file()

try:
    build = client.build_proxy.cancel(123)
    print("Build {} is {}".format(build.id, build.state))
except CoprRequestException as ex:
    print(ex)

In case that the build can be canceled, we get this output.

Build 123 is canceled

Otherwise, an exception is raised and handled.

Cannot cancel build 123

Debugging

Sometimes it is useful to dig deeper and examine the failure. Exceptions contain a result attribute returning a [Munch](https://github.com/Infinidat/munch) with additional information.

except CoprRequestException as ex:
    print(ex)
    print(ex.result)
Cannot cancel build 123
Munch({'__response__': <Response [500]>, 'error': u'Cannot cancel build 123'})

The stored response is a standard requests.Reponse so every possible detail like status code or headers can be examined.

except CoprRequestException as ex:
    print(type(ex.result.__response__))
    print(ex.result.__response__)
    print(ex.result.__response__.status_code)
    print(ex.result.__response__.headers)
<class 'requests.models.Response'>
<Response [500]>
500
{'Date': 'Wed, 25 Jul 2018 21:40:48 GMT', 'Content-Length': '42', 'Content-Type': 'application/json', 'Server': 'Werkzeug/0.12.2 Python/3.6.4'}

Status codes

An apropriate status codes are used for specific situations.

Status code

Reason

200

Successful request

401

Unauthorized request when login is required

403

Insufficient permissions, e.g. modifying a project of someone else

404

API endpoint or requested object was not found

500

General frontend error

Exception hierarchy

exception copr.v3.exceptions.CoprException(msg=None, response=None)[source]

Bases: Exception

Base Copr exception

exception copr.v3.exceptions.CoprRequestException(msg=None, response=None)[source]

Bases: CoprException

Raised when the API request doesn’t proceed successfully

exception copr.v3.exceptions.CoprNoResultException(msg=None, response=None)[source]

Bases: CoprException

Raised when no result data is returned

exception copr.v3.exceptions.CoprTimeoutException(msg=None, response=None)[source]

Bases: CoprException

Raised when the API request timeouted

exception copr.v3.exceptions.CoprValidationException(msg=None, response=None)[source]

Bases: CoprException

Raised when the data sent from client to API are not valid

exception copr.v3.exceptions.CoprNoConfigException(msg=None, response=None)[source]

Bases: CoprException

Exception thrown when no config file is found We left this exception in our code because someone can still catch it

exception copr.v3.exceptions.CoprConfigException(msg=None, response=None)[source]

Bases: CoprException

Exception thrown when the config file is incomplete or malformed.

exception copr.v3.exceptions.CoprAuthException(msg=None, response=None)[source]

Bases: CoprException

Copr authentication failure