diff --git a/plugins/module_utils/linode_common.py b/plugins/module_utils/linode_common.py index b05dfc95..d5f35f3a 100644 --- a/plugins/module_utils/linode_common.py +++ b/plugins/module_utils/linode_common.py @@ -7,7 +7,6 @@ import polling from ansible_collections.linode.cloud.plugins.module_utils.linode_helper import ( - format_api_error, format_generic_error, ) @@ -159,7 +158,7 @@ def __init__( res = self.exec_module(**self.module.params) except ApiError as err: # We don't want to return a stack trace for an API error - self.fail(msg=format_api_error(err)) + self.fail(msg=f"Error from Linode API: {str(err)}") except polling.TimeoutException as err: self.fail( msg="failed to wait for condition: timeout period expired" diff --git a/plugins/module_utils/linode_helper.py b/plugins/module_utils/linode_helper.py index f2d69ed4..0429881b 100644 --- a/plugins/module_utils/linode_helper.py +++ b/plugins/module_utils/linode_helper.py @@ -5,7 +5,6 @@ import linode_api4 import polling from linode_api4 import ( - ApiError, LinodeClient, LKENodePool, LKENodePoolNode, @@ -329,12 +328,6 @@ def get_all_paginated( return result -def format_api_error(err: ApiError) -> str: - """Formats an API error into a readable string""" - - return f"Error from Linode API: [{err.status}] {';'.join(err.errors)}" - - def format_generic_error(err: Exception) -> str: """Formats a generic error into a readable string""" diff --git a/requirements.txt b/requirements.txt index d1030e00..3490bb5b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -linode-api4>=5.22.0 +linode-api4>=5.24.0 polling==0.3.2 ansible-specdoc>=0.0.15 diff --git a/tests/integration/targets/api_error/tasks/main.yaml b/tests/integration/targets/api_error/tasks/main.yaml new file mode 100644 index 00000000..afeb74b7 --- /dev/null +++ b/tests/integration/targets/api_error/tasks/main.yaml @@ -0,0 +1,24 @@ +- name: api_error + block: + - name: Attempt to create an instance with validation errors + linode.cloud.instance: + region: fake-region + type: g6-fake-plan + state: present + register: failing_request + failed_when: '"msg" not in failing_request' + + - name: Ensure the error message is formatted as expected + assert: + that: + - failing_request.changed == False + - 'failing_request.msg.startswith("Error from Linode API: POST /v4beta/linode/instances: [400]")' + - '"type: A valid plan type by that ID was not found" in failing_request.msg' + - '"region: region is not valid" in failing_request.msg' + + environment: + LINODE_UA_PREFIX: '{{ ua_prefix }}' + LINODE_API_TOKEN: '{{ api_token }}' + LINODE_API_URL: '{{ api_url }}' + LINODE_API_VERSION: '{{ api_version }}' + LINODE_CA: '{{ ca_file or "" }}'