ansible-collection icon indicating copy to clipboard operation
ansible-collection copied to clipboard

tag creation is optimistic and can fail without bubbling up exception

Open dmsimard opened this issue 9 months ago • 0 comments

Summary

I was trying to create a tag called "infra.domain.tld" and it didn't work with this exception excerpt:

  File "/home/dmsimard/.ansible/tmp/ansible-tmp-1716092997.965093-220630-15469053834849/AnsiballZ_tag.py", line 47, in invoke_module
    runpy.run_module(mod_name='ansible_collections.digitalocean.cloud.plugins.modules.tag', init_globals=dict(_module_fqn='ansible_collections.digitalocean.cloud.plugins.modules.tag', _modlib_path=modlib_path),
  File "<frozen runpy>", line 226, in run_module
  File "<frozen runpy>", line 98, in _run_module_code
  File "<frozen runpy>", line 88, in _run_code
  File "/tmp/ansible_digitalocean.cloud.tag_payload_k2tn93x1/ansible_digitalocean.cloud.tag_payload.zip/ansible_collections/digitalocean/cloud/plugins/modules/tag.py", line 246, in <module>
  File "/tmp/ansible_digitalocean.cloud.tag_payload_k2tn93x1/ansible_digitalocean.cloud.tag_payload.zip/ansible_collections/digitalocean/cloud/plugins/modules/tag.py", line 242, in main
  File "/tmp/ansible_digitalocean.cloud.tag_payload_k2tn93x1/ansible_digitalocean.cloud.tag_payload.zip/ansible_collections/digitalocean/cloud/plugins/modules/tag.py", line 116, in __init__
  File "/tmp/ansible_digitalocean.cloud.tag_payload_k2tn93x1/ansible_digitalocean.cloud.tag_payload.zip/ansible_collections/digitalocean/cloud/plugins/modules/tag.py", line 194, in present
  File "/tmp/ansible_digitalocean.cloud.tag_payload_k2tn93x1/ansible_digitalocean.cloud.tag_payload.zip/ansible_collections/digitalocean/cloud/plugins/modules/tag.py", line 146, in create_tag
KeyError: 'tag'
fatal: [localhost]: FAILED! => {
    "changed": false,
    "module_stderr": "Traceback (most recent call last):\n  File \"/home/dmsimard/.ansible/tmp/ansible-tmp-1716092997.965093-220630-15469053834849/AnsiballZ_tag.py\", line 107, in <module>\n    _ansiballz_main()\n  File \"/home/dmsimard/.ansible/tmp/ansible-tmp-1716092997.965093-220630-15469053834849/AnsiballZ_tag.py\", line 99, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/home/dmsimard/.ansible/tmp/ansible-tmp-1716092997.965093-220630-15469053834849/AnsiballZ_tag.py\", line 47, in invoke_module\n    runpy.run_module(mod_name='ansible_collections.digitalocean.cloud.plugins.modules.tag', init_globals=dict(_module_fqn='ansible_collections.digitalocean.cloud.plugins.modules.tag', _modlib_path=modlib_path),\n  File \"<frozen runpy>\", line 226, in run_module\n  File \"<frozen runpy>\", line 98, in _run_module_code\n  File \"<frozen runpy>\", line 88, in _run_code\n  File \"/tmp/ansible_digitalocean.cloud.tag_payload_k2tn93x1/ansible_digitalocean.cloud.tag_payload.zip/ansible_collections/digitalocean/cloud/plugins/modules/tag.py\", line 246, in <module>\n  File \"/tmp/ansible_digitalocean.cloud.tag_payload_k2tn93x1/ansible_digitalocean.cloud.tag_payload.zip/ansible_collections/digitalocean/cloud/plugins/modules/tag.py\", line 242, in main\n  File \"/tmp/ansible_digitalocean.cloud.tag_payload_k2tn93x1/ansible_digitalocean.cloud.tag_payload.zip/ansible_collections/digitalocean/cloud/plugins/modules/tag.py\", line 116, in __init__\n  File \"/tmp/ansible_digitalocean.cloud.tag_payload_k2tn93x1/ansible_digitalocean.cloud.tag_payload.zip/ansible_collections/digitalocean/cloud/plugins/modules/tag.py\", line 194, in present\n  File \"/tmp/ansible_digitalocean.cloud.tag_payload_k2tn93x1/ansible_digitalocean.cloud.tag_payload.zip/ansible_collections/digitalocean/cloud/plugins/modules/tag.py\", line 146, in create_tag\nKeyError: 'tag'\n",
    "module_stdout": "",
    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
    "rc": 1
}

Editing the module locally, I found that there was an API exception the likes of the following:

fatal: [localhost]: FAILED! => {
    "changed": false,
    "module_stderr": "",
    "module_stdout": "{'name': 'infra.domain.tld'}\n{'error': 'Error validating resource tag: \"tag-name \\\\\"infra.domain.tld\\\\\" contains invalid characters\"', 'root_causes': ['rpc error: code = InvalidArgument desc = Error validating resource tag: \"tag-name \\\\\"infra.domain.tld\\\\\" contains invalid characters\"'], 'messages': None}\n\n{\"changed\": true, \"msg\": \"Created tag infra.domain.tld\", \"tag\": {\"error\": \"Error validating resource tag: \\\"tag-name \\\\\\\"infra.domain.tld\\\\\\\" contains invalid characters\\\"\", \"root_causes\": [\"rpc error: code = InvalidArgument desc = Error validating resource tag: \\\"tag-name \\\\\\\"infra.domain.tld\\\\\\\" contains invalid characters\\\"\"], \"messages\": null}, \"invocation\": {\"module_args\": {\"token\": \"VALUE_SPECIFIED_IN_NO_LOG_PARAMETER\", \"name\": \"infra.domain.tld\", \"state\": \"present\", \"timeout\": 300, \"client_override_options\": null, \"module_override_options\": null}}}\n",
    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
    "rc": 0
}

The module should probably have something like a try/except here: https://github.com/digitalocean/ansible-collection/blob/5abaa3caf85ed33ce34bc519d135de5f07da69f7/plugins/modules/tag.py#L146

Where on a KeyError it would bubble up the exception instead.

Issue Type

Bug Report

Component Name

tag

Ansible Version

n/a

Configuration

n/a

OS / Environment

n/a

Steps to Reproduce

    - name: Create a tag to associate our resources with
      digitalocean.cloud.tag:
        name: "domain.extension.tld"
        state: present

Expected Results

It works or bubbles up an exception if there is one.

Actual Results

See summary.

Code of Conduct

  • [X] I agree to follow the Ansible Code of Conduct

dmsimard avatar May 19 '24 04:05 dmsimard