mirror of
				https://github.com/ansible-collections/community.general.git
				synced 2025-10-25 05:23:58 -07:00 
			
		
		
		
	[PR #9539/94d5256a backport][stable-10] Fix #9538 Inventory iocage fails when DHCP is enabled (#9568)
Fix #9538  Inventory iocage fails when DHCP is enabled (#9539)
* Fix #9538  Inventory iocage fails when DHCP is enbled.
* Add changelog fragment 9539-iocage-inventory-dhcp.yml
* Keep iocage_ip4 a string.
* Rename the variable iocage_ip4 to iocage_ip4_dict in _parse_ip4.
* Update the changelog fragment.
* Rename _parse_ip4 parameter ip4_addr to ip4.
* Fix changelog frangment present tense.
* If IP is not available set iocage_ip4='-' instead of the empty string.
* Update changelogs/fragments/9539-iocage-inventory-dhcp.yml
Co-authored-by: Felix Fontein <felix@fontein.de>
---------
Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 94d5256adb)
Co-authored-by: Vladimir Botka <vbotka@gmail.com>
	
	
This commit is contained in:
		
					parent
					
						
							
								2314db59c7
							
						
					
				
			
			
				commit
				
					
						6907ae5a5e
					
				
			
		
					 28 changed files with 243 additions and 17 deletions
				
			
		
							
								
								
									
										2
									
								
								changelogs/fragments/9539-iocage-inventory-dhcp.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								changelogs/fragments/9539-iocage-inventory-dhcp.yml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | |||
| bugfixes: | ||||
|   - iocage inventory plugin - the plugin parses the IP4 tab of the jails list and put the elements into the new variable ``iocage_ip4_dict``. In multiple interface format the variable ``iocage_ip4`` keeps the comma-separated list of IP4 (https://github.com/ansible-collections/community.general/issues/9538). | ||||
|  | @ -131,9 +131,27 @@ display = Display() | |||
| 
 | ||||
| 
 | ||||
| def _parse_ip4(ip4): | ||||
|     if ip4 == '-': | ||||
|         return ip4 | ||||
|     return re.split('\\||/', ip4)[1] | ||||
|     ''' Return dictionary iocage_ip4_dict. default = {ip4: [], msg: ''}. | ||||
|         If item matches ifc|IP or ifc|CIDR parse ifc, ip, and mask. | ||||
|         Otherwise, append item to msg. | ||||
|     ''' | ||||
| 
 | ||||
|     iocage_ip4_dict = {} | ||||
|     iocage_ip4_dict['ip4'] = [] | ||||
|     iocage_ip4_dict['msg'] = '' | ||||
| 
 | ||||
|     items = ip4.split(',') | ||||
|     for item in items: | ||||
|         if re.match('^\\w+\\|(?:\\d{1,3}\\.){3}\\d{1,3}.*$', item): | ||||
|             i = re.split('\\||/', item) | ||||
|             if len(i) == 3: | ||||
|                 iocage_ip4_dict['ip4'].append({'ifc': i[0], 'ip': i[1], 'mask': i[2]}) | ||||
|             else: | ||||
|                 iocage_ip4_dict['ip4'].append({'ifc': i[0], 'ip': i[1], 'mask': '-'}) | ||||
|         else: | ||||
|             iocage_ip4_dict['msg'] += item | ||||
| 
 | ||||
|     return iocage_ip4_dict | ||||
| 
 | ||||
| 
 | ||||
| class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): | ||||
|  | @ -194,7 +212,6 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): | |||
| 
 | ||||
|         cmd_list = cmd.copy() | ||||
|         cmd_list.append('list') | ||||
|         cmd_list.append('--header') | ||||
|         cmd_list.append('--long') | ||||
|         try: | ||||
|             p = Popen(cmd_list, stdout=PIPE, stderr=PIPE, env=my_env) | ||||
|  | @ -239,16 +256,26 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): | |||
|         return results | ||||
| 
 | ||||
|     def get_jails(self, t_stdout, results): | ||||
|         jails = [x.split() for x in t_stdout.splitlines()] | ||||
|         for jail in jails: | ||||
|         lines = t_stdout.splitlines() | ||||
|         if len(lines) < 5: | ||||
|             return | ||||
|         indices = [i for i, val in enumerate(lines[1]) if val == '|'] | ||||
|         for line in lines[3::2]: | ||||
|             jail = [line[i + 1:j].strip() for i, j in zip(indices[:-1], indices[1:])] | ||||
|             iocage_name = jail[1] | ||||
|             iocage_ip4_dict = _parse_ip4(jail[6]) | ||||
|             if iocage_ip4_dict['ip4']: | ||||
|                 iocage_ip4 = ','.join([d['ip'] for d in iocage_ip4_dict['ip4']]) | ||||
|             else: | ||||
|                 iocage_ip4 = '-' | ||||
|             results['_meta']['hostvars'][iocage_name] = {} | ||||
|             results['_meta']['hostvars'][iocage_name]['iocage_jid'] = jail[0] | ||||
|             results['_meta']['hostvars'][iocage_name]['iocage_boot'] = jail[2] | ||||
|             results['_meta']['hostvars'][iocage_name]['iocage_state'] = jail[3] | ||||
|             results['_meta']['hostvars'][iocage_name]['iocage_type'] = jail[4] | ||||
|             results['_meta']['hostvars'][iocage_name]['iocage_release'] = jail[5] | ||||
|             results['_meta']['hostvars'][iocage_name]['iocage_ip4'] = _parse_ip4(jail[6]) | ||||
|             results['_meta']['hostvars'][iocage_name]['iocage_ip4_dict'] = iocage_ip4_dict | ||||
|             results['_meta']['hostvars'][iocage_name]['iocage_ip4'] = iocage_ip4 | ||||
|             results['_meta']['hostvars'][iocage_name]['iocage_ip6'] = jail[7] | ||||
|             results['_meta']['hostvars'][iocage_name]['iocage_template'] = jail[8] | ||||
|             results['_meta']['hostvars'][iocage_name]['iocage_basejail'] = jail[9] | ||||
|  |  | |||
|  | @ -5,6 +5,12 @@ all: | |||
|         test_101: | ||||
|           iocage_basejail: 'yes' | ||||
|           iocage_boot: 'off' | ||||
|           iocage_ip4_dict: | ||||
|             ip4: | ||||
|               - ifc: vnet0 | ||||
|                 ip: 10.1.0.101 | ||||
|                 mask: '24' | ||||
|             msg: '' | ||||
|           iocage_ip4: 10.1.0.101 | ||||
|           iocage_ip6: '-' | ||||
|           iocage_jid: '-' | ||||
|  | @ -157,6 +163,12 @@ all: | |||
|         test_102: | ||||
|           iocage_basejail: 'yes' | ||||
|           iocage_boot: 'off' | ||||
|           iocage_ip4_dict: | ||||
|             ip4: | ||||
|               - ifc: vnet0 | ||||
|                 ip: 10.1.0.102 | ||||
|                 mask: '24' | ||||
|             msg: '' | ||||
|           iocage_ip4: 10.1.0.102 | ||||
|           iocage_ip6: '-' | ||||
|           iocage_jid: '-' | ||||
|  | @ -309,6 +321,12 @@ all: | |||
|         test_103: | ||||
|           iocage_basejail: 'yes' | ||||
|           iocage_boot: 'off' | ||||
|           iocage_ip4_dict: | ||||
|             ip4: | ||||
|               - ifc: vnet0 | ||||
|                 ip: 10.1.0.103 | ||||
|                 mask: '24' | ||||
|             msg: '' | ||||
|           iocage_ip4: 10.1.0.103 | ||||
|           iocage_ip6: '-' | ||||
|           iocage_jid: '-' | ||||
|  | @ -0,0 +1,9 @@ | |||
| +------+----------+------+-------+------+-----------------+---------------------+-----+----------------+----------+ | ||||
| | JID  | NAME     | BOOT | STATE | TYPE |     RELEASE     |        IP4          | IP6 |    TEMPLATE    | BASEJAIL | | ||||
| +======+==========+======+=======+======+=================+=====================+=====+================+==========+ | ||||
| | -    | test_101 | off  | down  | jail | 13.4-RELEASE-p2 | vnet0|10.1.0.101/24 | -   | ansible_client | yes      | | ||||
| +------+----------------+------+-------+------+-----------------+--------------------+-----+----------------+-----+ | ||||
| | -    | test_102 | off  | down  | jail | 13.4-RELEASE-p2 | vnet0|10.1.0.102/24 | -   | ansible_client | yes      | | ||||
| +------+----------------+------+-------+------+-----------------+--------------------+-----+----------------+-----+ | ||||
| | -    | test_103 | off  | down  | jail | 13.4-RELEASE-p2 | vnet0|10.1.0.103/24 | -   | ansible_client | yes      | | ||||
| +------+----------------+------+-------+------+-----------------+--------------------+-----+----------------+-----+ | ||||
|  | @ -3,6 +3,12 @@ _meta: | |||
|     test_101: | ||||
|       iocage_basejail: 'yes' | ||||
|       iocage_boot: 'off' | ||||
|       iocage_ip4_dict: | ||||
|         ip4: | ||||
|           - ifc: vnet0 | ||||
|             ip: 10.1.0.101 | ||||
|             mask: '24' | ||||
|         msg: '' | ||||
|       iocage_ip4: 10.1.0.101 | ||||
|       iocage_ip6: '-' | ||||
|       iocage_jid: '-' | ||||
|  | @ -13,6 +19,12 @@ _meta: | |||
|     test_102: | ||||
|       iocage_basejail: 'yes' | ||||
|       iocage_boot: 'off' | ||||
|       iocage_ip4_dict: | ||||
|         ip4: | ||||
|           - ifc: vnet0 | ||||
|             ip: 10.1.0.102 | ||||
|             mask: '24' | ||||
|         msg: '' | ||||
|       iocage_ip4: 10.1.0.102 | ||||
|       iocage_ip6: '-' | ||||
|       iocage_jid: '-' | ||||
|  | @ -23,6 +35,12 @@ _meta: | |||
|     test_103: | ||||
|       iocage_basejail: 'yes' | ||||
|       iocage_boot: 'off' | ||||
|       iocage_ip4_dict: | ||||
|         ip4: | ||||
|           - ifc: vnet0 | ||||
|             ip: 10.1.0.103 | ||||
|             mask: '24' | ||||
|         msg: '' | ||||
|       iocage_ip4: 10.1.0.103 | ||||
|       iocage_ip6: '-' | ||||
|       iocage_jid: '-' | ||||
|  | @ -0,0 +1,9 @@ | |||
| +------+----------------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ | ||||
| | JID  |      NAME      | BOOT | STATE | TYPE |     RELEASE     |        IP4         | IP6 |    TEMPLATE    | BASEJAIL | | ||||
| +======+================+======+=======+======+=================+====================+=====+================+==========+ | ||||
| | 268  | test_111       | off  | up    | jail | 14.1-RELEASE-p6 | epair0b|10.1.0.174 | -   | ansible_client | yes      | | ||||
| +------+----------------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ | ||||
| | 269  | test_112       | off  | up    | jail | 14.1-RELEASE-p6 | epair0b|10.1.0.147 | -   | ansible_client | yes      | | ||||
| +------+----------------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ | ||||
| | 270  | test_113       | off  | up    | jail | 14.1-RELEASE-p6 | epair0b|10.1.0.231 | -   | ansible_client | yes      | | ||||
| +------+----------------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ | ||||
|  | @ -0,0 +1,50 @@ | |||
| _meta: | ||||
|   hostvars: | ||||
|     test_111: | ||||
|       iocage_basejail: 'yes' | ||||
|       iocage_boot: 'off' | ||||
|       iocage_ip4_dict: | ||||
|         ip4: | ||||
|           - ifc: epair0b | ||||
|             ip: 10.1.0.174 | ||||
|             mask: '-' | ||||
|         msg: '' | ||||
|       iocage_ip4: 10.1.0.174 | ||||
|       iocage_ip6: '-' | ||||
|       iocage_jid: '268' | ||||
|       iocage_release: 14.1-RELEASE-p6 | ||||
|       iocage_state: up | ||||
|       iocage_template: ansible_client | ||||
|       iocage_type: jail | ||||
|     test_112: | ||||
|       iocage_basejail: 'yes' | ||||
|       iocage_boot: 'off' | ||||
|       iocage_ip4_dict: | ||||
|         ip4: | ||||
|           - ifc: epair0b | ||||
|             ip: 10.1.0.147 | ||||
|             mask: '-' | ||||
|         msg: '' | ||||
|       iocage_ip4: 10.1.0.147 | ||||
|       iocage_ip6: '-' | ||||
|       iocage_jid: '269' | ||||
|       iocage_release: 14.1-RELEASE-p6 | ||||
|       iocage_state: up | ||||
|       iocage_template: ansible_client | ||||
|       iocage_type: jail | ||||
|     test_113: | ||||
|       iocage_basejail: 'yes' | ||||
|       iocage_boot: 'off' | ||||
|       iocage_ip4_dict: | ||||
|         ip4: | ||||
|           - ifc: epair0b | ||||
|             ip: 10.1.0.231 | ||||
|             mask: '-' | ||||
|         msg: '' | ||||
|       iocage_ip4: 10.1.0.231 | ||||
|       iocage_ip6: '-' | ||||
|       iocage_jid: '270' | ||||
|       iocage_release: 14.1-RELEASE-p6 | ||||
|       iocage_state: up | ||||
|       iocage_template: ansible_client | ||||
|       iocage_type: jail | ||||
|  | @ -0,0 +1,9 @@ | |||
| +------+----------------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ | ||||
| | JID  |      NAME      | BOOT | STATE | TYPE |     RELEASE     |        IP4         | IP6 |    TEMPLATE    | BASEJAIL | | ||||
| +======+================+======+=======+======+=================+====================+=====+================+==========+ | ||||
| | None | test_111       | off  | down  | jail | 14.1-RELEASE-p6 | DHCP (not running) | -   | ansible_client | yes      | | ||||
| +------+----------------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ | ||||
| | None | test_112       | off  | down  | jail | 14.1-RELEASE-p6 | DHCP (not running) | -   | ansible_client | yes      | | ||||
| +------+----------------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ | ||||
| | None | test_113       | off  | down  | jail | 14.1-RELEASE-p6 | DHCP (not running) | -   | ansible_client | yes      | | ||||
| +------+----------------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ | ||||
|  | @ -0,0 +1,41 @@ | |||
| _meta: | ||||
|   hostvars: | ||||
|     test_111: | ||||
|       iocage_basejail: 'yes' | ||||
|       iocage_boot: 'off' | ||||
|       iocage_ip4_dict: | ||||
|         ip4: [] | ||||
|         msg: 'DHCP (not running)' | ||||
|       iocage_ip4: '-' | ||||
|       iocage_ip6: '-' | ||||
|       iocage_jid: 'None' | ||||
|       iocage_release: 14.1-RELEASE-p6 | ||||
|       iocage_state: down | ||||
|       iocage_template: ansible_client | ||||
|       iocage_type: jail | ||||
|     test_112: | ||||
|       iocage_basejail: 'yes' | ||||
|       iocage_boot: 'off' | ||||
|       iocage_ip4_dict: | ||||
|         ip4: [] | ||||
|         msg: 'DHCP (not running)' | ||||
|       iocage_ip4: '-' | ||||
|       iocage_ip6: '-' | ||||
|       iocage_jid: 'None' | ||||
|       iocage_release: 14.1-RELEASE-p6 | ||||
|       iocage_state: down | ||||
|       iocage_template: ansible_client | ||||
|       iocage_type: jail | ||||
|     test_113: | ||||
|       iocage_basejail: 'yes' | ||||
|       iocage_boot: 'off' | ||||
|       iocage_ip4_dict: | ||||
|         ip4: [] | ||||
|         msg: 'DHCP (not running)' | ||||
|       iocage_ip4: '-' | ||||
|       iocage_ip6: '-' | ||||
|       iocage_jid: 'None' | ||||
|       iocage_release: 14.1-RELEASE-p6 | ||||
|       iocage_state: down | ||||
|       iocage_template: ansible_client | ||||
|       iocage_type: jail | ||||
|  | @ -3,6 +3,12 @@ _meta: | |||
|     test_101: | ||||
|       iocage_basejail: 'yes' | ||||
|       iocage_boot: 'off' | ||||
|       iocage_ip4_dict: | ||||
|         ip4: | ||||
|           - ifc: vnet0 | ||||
|             ip: 10.1.0.101 | ||||
|             mask: '24' | ||||
|         msg: '' | ||||
|       iocage_ip4: 10.1.0.101 | ||||
|       iocage_ip6: '-' | ||||
|       iocage_jid: '-' | ||||
|  | @ -155,6 +161,12 @@ _meta: | |||
|     test_102: | ||||
|       iocage_basejail: 'yes' | ||||
|       iocage_boot: 'off' | ||||
|       iocage_ip4_dict: | ||||
|         ip4: | ||||
|           - ifc: vnet0 | ||||
|             ip: 10.1.0.102 | ||||
|             mask: '24' | ||||
|         msg: '' | ||||
|       iocage_ip4: 10.1.0.102 | ||||
|       iocage_ip6: '-' | ||||
|       iocage_jid: '-' | ||||
|  | @ -307,6 +319,12 @@ _meta: | |||
|     test_103: | ||||
|       iocage_basejail: 'yes' | ||||
|       iocage_boot: 'off' | ||||
|       iocage_ip4_dict: | ||||
|         ip4: | ||||
|           - ifc: vnet0 | ||||
|             ip: 10.1.0.103 | ||||
|             mask: '24' | ||||
|         msg: '' | ||||
|       iocage_ip4: 10.1.0.103 | ||||
|       iocage_ip6: '-' | ||||
|       iocage_jid: '-' | ||||
|  | @ -0,0 +1,3 @@ | |||
| GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) | ||||
| SPDX-License-Identifier: GPL-3.0-or-later | ||||
| SPDX-FileCopyrightText: Ansible Project | ||||
|  | @ -0,0 +1,3 @@ | |||
| GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) | ||||
| SPDX-License-Identifier: GPL-3.0-or-later | ||||
| SPDX-FileCopyrightText: Ansible Project | ||||
|  | @ -0,0 +1,3 @@ | |||
| GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) | ||||
| SPDX-License-Identifier: GPL-3.0-or-later | ||||
| SPDX-FileCopyrightText: Ansible Project | ||||
|  | @ -0,0 +1,3 @@ | |||
| GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) | ||||
| SPDX-License-Identifier: GPL-3.0-or-later | ||||
| SPDX-FileCopyrightText: Ansible Project | ||||
|  | @ -1,3 +0,0 @@ | |||
| -	test_101	off	down	jail	13.4-RELEASE-p2	vnet0|10.1.0.101/24	-	ansible_client	yes | ||||
| -	test_102	off	down	jail	13.4-RELEASE-p2	vnet0|10.1.0.102/24	-	ansible_client	yes | ||||
| -	test_103	off	down	jail	13.4-RELEASE-p2	vnet0|10.1.0.103/24	-	ansible_client	yes | ||||
|  | @ -20,14 +20,18 @@ def inventory(): | |||
|     inv = InventoryModule() | ||||
|     inv.inventory = InventoryData() | ||||
|     inv.templar = Templar(None) | ||||
|     inv.jails = load_txt_data('tests/unit/plugins/inventory/fixtures/iocage_jails.txt') | ||||
|     inv.js_ok = load_yml_data('tests/unit/plugins/inventory/fixtures/iocage_jails.yml') | ||||
|     prpts_101 = load_txt_data('tests/unit/plugins/inventory/fixtures/iocage_properties_test_101.txt') | ||||
|     prpts_102 = load_txt_data('tests/unit/plugins/inventory/fixtures/iocage_properties_test_102.txt') | ||||
|     prpts_103 = load_txt_data('tests/unit/plugins/inventory/fixtures/iocage_properties_test_103.txt') | ||||
|     inv.jails = load_txt_data('tests/unit/plugins/inventory/fixtures/iocage/iocage_jails.txt') | ||||
|     inv.js_ok = load_yml_data('tests/unit/plugins/inventory/fixtures/iocage/iocage_jails.yml') | ||||
|     inv.jails_dhcp = load_txt_data('tests/unit/plugins/inventory/fixtures/iocage/iocage_jails_dhcp.txt') | ||||
|     inv.js_dhcp_ok = load_yml_data('tests/unit/plugins/inventory/fixtures/iocage/iocage_jails_dhcp.yml') | ||||
|     inv.jails_dhcp_nr = load_txt_data('tests/unit/plugins/inventory/fixtures/iocage/iocage_jails_dhcp_not_running.txt') | ||||
|     inv.js_dhcp_nr_ok = load_yml_data('tests/unit/plugins/inventory/fixtures/iocage/iocage_jails_dhcp_not_running.yml') | ||||
|     prpts_101 = load_txt_data('tests/unit/plugins/inventory/fixtures/iocage/iocage_properties_test_101.txt') | ||||
|     prpts_102 = load_txt_data('tests/unit/plugins/inventory/fixtures/iocage/iocage_properties_test_102.txt') | ||||
|     prpts_103 = load_txt_data('tests/unit/plugins/inventory/fixtures/iocage/iocage_properties_test_103.txt') | ||||
|     inv.prpts = {'test_101': prpts_101, 'test_102': prpts_102, 'test_103': prpts_103} | ||||
|     inv.ps_ok = load_yml_data('tests/unit/plugins/inventory/fixtures/iocage_properties.yml') | ||||
|     inv.ok = load_yml_data('tests/unit/plugins/inventory/fixtures/iocage_inventory.yml') | ||||
|     inv.ps_ok = load_yml_data('tests/unit/plugins/inventory/fixtures/iocage/iocage_properties.yml') | ||||
|     inv.ok = load_yml_data('tests/unit/plugins/inventory/fixtures/iocage/iocage_inventory.yml') | ||||
|     return inv | ||||
| 
 | ||||
| 
 | ||||
|  | @ -72,10 +76,22 @@ def test_verify_file(tmp_path, inventory): | |||
| 
 | ||||
| 
 | ||||
| def test_get_jails(inventory): | ||||
| 
 | ||||
|     # jails | ||||
|     results = {'_meta': {'hostvars': {}}} | ||||
|     inventory.get_jails(inventory.jails, results) | ||||
|     assert results == inventory.js_ok | ||||
| 
 | ||||
|     # jails_dhcp | ||||
|     results = {'_meta': {'hostvars': {}}} | ||||
|     inventory.get_jails(inventory.jails_dhcp, results) | ||||
|     assert results == inventory.js_dhcp_ok | ||||
| 
 | ||||
|     # jails_dhcp_not_running | ||||
|     results = {'_meta': {'hostvars': {}}} | ||||
|     inventory.get_jails(inventory.jails_dhcp_nr, results) | ||||
|     assert results == inventory.js_dhcp_nr_ok | ||||
| 
 | ||||
| 
 | ||||
| def test_get_properties(inventory): | ||||
|     results = {'_meta': {'hostvars': {}}} | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue