Skip to content

Commit

Permalink
Allow tower inventory plugin to accept integer inventory_id (ansible#…
Browse files Browse the repository at this point in the history
  • Loading branch information
AlanCoding authored and vasilyprokopov committed Sep 15, 2019
1 parent 7bdeae4 commit 8b54eec
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 4 deletions.
@@ -0,0 +1,3 @@
---
bugfixes:
- tower inventory plugin - fix TypeError when giving integer_id as integer (https://github.com/ansible/ansible/issues/61333)
24 changes: 20 additions & 4 deletions lib/ansible/plugins/inventory/tower.py
Expand Up @@ -47,8 +47,12 @@
- name: TOWER_PASSWORD
required: True
inventory_id:
description: The ID of the Ansible Tower inventory that you wish to import.
type: string
description:
- The ID of the Ansible Tower inventory that you wish to import.
- This is allowed to be either the inventory primary key or its named URL slug.
- Primary key values will be accepted as strings or integers, and URL slugs must be strings.
- Named URL slugs follow the syntax of "inventory_name++organization_name".
type: raw
env:
- name: TOWER_INVENTORY
required: True
Expand Down Expand Up @@ -100,8 +104,9 @@
from ansible.module_utils import six
from ansible.module_utils.urls import Request, urllib_error, ConnectionError, socket, httplib
from ansible.module_utils._text import to_native
from ansible.errors import AnsibleParserError
from ansible.errors import AnsibleParserError, AnsibleOptionsError
from ansible.plugins.inventory import BaseInventoryPlugin
from ansible.config.manager import ensure_type

# Python 2/3 Compatibility
try:
Expand Down Expand Up @@ -159,7 +164,18 @@ def parse(self, inventory, loader, path, cache=True):
force_basic_auth=True,
validate_certs=self.get_option('validate_certs'))

inventory_id = self.get_option('inventory_id').replace('/', '')
# validate type of inventory_id because we allow two types as special case
inventory_id = self.get_option('inventory_id')
if isinstance(inventory_id, int):
inventory_id = to_native(self.get_option('inventory_id'))
else:
try:
inventory_id = ensure_type(inventory_id, 'str')
except ValueError as e:
raise AnsibleOptionsError(
'Invalid type for configuration option inventory_id, '
'not integer, and cannot convert to string: %s' % to_native(e))
inventory_id = inventory_id.replace('/', '')
inventory_url = '/api/v2/inventories/{inv_id}/script/?hostvars=1&towervars=1&all=1'.format(inv_id=inventory_id)
inventory_url = urljoin(tower_host, inventory_url)

Expand Down

0 comments on commit 8b54eec

Please sign in to comment.