diff --git a/.github/BOTMETA.yml b/.github/BOTMETA.yml index ec9b9b7ddc8..36942b30f26 100644 --- a/.github/BOTMETA.yml +++ b/.github/BOTMETA.yml @@ -213,6 +213,8 @@ files: maintainers: opoplawski $inventories/gitlab_runners.py: maintainers: morph027 + $inventories/iocage.py: + maintainers: vbotka $inventories/icinga2.py: maintainers: BongoEADGC6 $inventories/linode.py: diff --git a/plugins/inventory/iocage.py b/plugins/inventory/iocage.py new file mode 100644 index 00000000000..6b51bb346ec --- /dev/null +++ b/plugins/inventory/iocage.py @@ -0,0 +1,266 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2024 Vladimir Botka +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +DOCUMENTATION = ''' + name: iocage + short_description: iocage inventory source + version_added: 10.2.0 + author: + - Vladimir Botka (@vbotka) + requirements: + - iocage >= 1.8 + description: + - Get inventory hosts from the iocage jail manager running on O(host). + - By default, O(host) is V(localhost). If O(host) is not V(localhost) it + is expected that the user running Ansible on the controller can + connect to the O(host) account O(user) with SSH non-interactively and + execute the command C(iocage list). + - Uses a configuration file as an inventory source, it must end + in C(.iocage.yml) or C(.iocage.yaml). + extends_documentation_fragment: + - ansible.builtin.constructed + - ansible.builtin.inventory_cache + options: + plugin: + description: + - The name of this plugin, it should always be set to + V(community.general.iocage) for this plugin to recognize + it as its own. + required: true + choices: ['community.general.iocage'] + type: str + host: + description: The IP/hostname of the C(iocage) host. + type: str + default: localhost + user: + description: + - C(iocage) user. + It is expected that the O(user) is able to connect to the + O(host) with SSH and execute the command C(iocage list). + This option is not required if O(host) is V(localhost). + type: str + get_properties: + description: + - Get jails' properties. + Creates dictionary C(iocage_properties) for each added host. + type: boolean + default: false + env: + description: O(user)'s environment on O(host). + type: dict + default: {} + notes: + - You might want to test the command C(ssh user@host iocage list -l) on + the controller before using this inventory plugin with O(user) specified + and with O(host) other than V(localhost). + - If you run this inventory plugin on V(localhost) C(ssh) is not used. + In this case, test the command C(iocage list -l). + - This inventory plugin creates variables C(iocage_*) for each added host. + - The values of these variables are collected from the output of the + command C(iocage list -l). + - The names of these variables correspond to the output columns. + - The column C(NAME) is used to name the added host. +''' + +EXAMPLES = ''' +# file name must end with iocage.yaml or iocage.yml +plugin: community.general.iocage +host: 10.1.0.73 +user: admin + +# user is not required if iocage is running on localhost (default) +plugin: community.general.iocage + +# run cryptography without legacy algorithms +plugin: community.general.iocage +host: 10.1.0.73 +user: admin +env: + CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1 + +# enable cache +plugin: community.general.iocage +host: 10.1.0.73 +user: admin +env: + CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1 +cache: true + +# see inventory plugin ansible.builtin.constructed +plugin: community.general.iocage +host: 10.1.0.73 +user: admin +env: + CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1 +cache: true +strict: false +compose: + ansible_host: iocage_ip4 + release: iocage_release | split('-') | first +groups: + test: inventory_hostname.startswith('test') +keyed_groups: + - prefix: distro + key: iocage_release + - prefix: state + key: iocage_state +''' + +import re +import os +from subprocess import Popen, PIPE + +from ansible.errors import AnsibleError, AnsibleParserError +from ansible.module_utils.common.text.converters import to_native, to_text +from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cacheable +from ansible.utils.display import Display + +display = Display() + + +def _parse_ip4(ip4): + if ip4 == '-': + return ip4 + return re.split('\\||/', ip4)[1] + + +class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): + ''' Host inventory parser for ansible using iocage as source. ''' + + NAME = 'community.general.iocage' + IOCAGE = '/usr/local/bin/iocage' + + def __init__(self): + super(InventoryModule, self).__init__() + + def verify_file(self, path): + valid = False + if super(InventoryModule, self).verify_file(path): + if path.endswith(('iocage.yaml', 'iocage.yml')): + valid = True + else: + self.display.vvv('Skipping due to inventory source not ending in "iocage.yaml" nor "iocage.yml"') + return valid + + def parse(self, inventory, loader, path, cache=True): + super(InventoryModule, self).parse(inventory, loader, path) + + self._read_config_data(path) + cache_key = self.get_cache_key(path) + + user_cache_setting = self.get_option('cache') + attempt_to_read_cache = user_cache_setting and cache + cache_needs_update = user_cache_setting and not cache + + if attempt_to_read_cache: + try: + results = self._cache[cache_key] + except KeyError: + cache_needs_update = True + if not attempt_to_read_cache or cache_needs_update: + results = self.get_inventory(path) + if cache_needs_update: + self._cache[cache_key] = results + + self.populate(results) + + def get_inventory(self, path): + host = self.get_option('host') + env = self.get_option('env') + get_properties = self.get_option('get_properties') + + cmd = [] + my_env = os.environ.copy() + if host == 'localhost': + my_env.update({str(k): str(v) for k, v in env.items()}) + else: + user = self.get_option('user') + cmd.append("ssh") + cmd.append(f"{user}@{host}") + cmd.extend([f"{k}={v}" for k, v in env.items()]) + cmd.append(self.IOCAGE) + + 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) + stdout, stderr = p.communicate() + if p.returncode != 0: + raise AnsibleError('Failed to run cmd=%s, rc=%s, stderr=%s' % + (cmd_list, p.returncode, to_native(stderr))) + + try: + t_stdout = to_text(stdout, errors='surrogate_or_strict') + except UnicodeError as e: + raise AnsibleError('Invalid (non unicode) input returned: %s' % to_native(e)) from e + + except Exception as e: + raise AnsibleParserError('Failed to parse %s: %s' % + (to_native(path), to_native(e))) from e + + results = {'_meta': {'hostvars': {}}} + self.get_jails(t_stdout, results) + + if get_properties: + for hostname, host_vars in results['_meta']['hostvars'].items(): + cmd_get_properties = cmd.copy() + cmd_get_properties.append("get") + cmd_get_properties.append("--all") + cmd_get_properties.append(f"{hostname}") + try: + p = Popen(cmd_get_properties, stdout=PIPE, stderr=PIPE, env=my_env) + stdout, stderr = p.communicate() + if p.returncode != 0: + raise AnsibleError('Failed to run cmd=%s, rc=%s, stderr=%s' % + (cmd_get_properties, p.returncode, to_native(stderr))) + + try: + t_stdout = to_text(stdout, errors='surrogate_or_strict') + except UnicodeError as e: + raise AnsibleError('Invalid (non unicode) input returned: %s' % to_native(e)) from e + + except Exception as e: + raise AnsibleError('Failed to get properties: %s' % to_native(e)) from e + + self.get_properties(t_stdout, results, hostname) + + return results + + def get_jails(self, t_stdout, results): + jails = [x.split() for x in t_stdout.splitlines()] + for jail in jails: + iocage_name = jail[1] + 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_ip6'] = jail[7] + results['_meta']['hostvars'][iocage_name]['iocage_template'] = jail[8] + results['_meta']['hostvars'][iocage_name]['iocage_basejail'] = jail[9] + + def get_properties(self, t_stdout, results, hostname): + properties = dict([x.split(':', 1) for x in t_stdout.splitlines()]) + results['_meta']['hostvars'][hostname]['iocage_properties'] = properties + + def populate(self, results): + strict = self.get_option('strict') + + for hostname, host_vars in results['_meta']['hostvars'].items(): + self.inventory.add_host(hostname, group='all') + for var, value in host_vars.items(): + self.inventory.set_variable(hostname, var, value) + self._set_composite_vars(self.get_option('compose'), host_vars, hostname, strict=True) + self._add_host_to_composed_groups(self.get_option('groups'), host_vars, hostname, strict=strict) + self._add_host_to_keyed_groups(self.get_option('keyed_groups'), host_vars, hostname, strict=strict) diff --git a/tests/unit/plugins/inventory/fixtures/iocage_inventory.yml b/tests/unit/plugins/inventory/fixtures/iocage_inventory.yml new file mode 100644 index 00000000000..850a54f549d --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_inventory.yml @@ -0,0 +1,460 @@ +all: + children: + test: + hosts: + test_101: + iocage_basejail: 'yes' + iocage_boot: 'off' + iocage_ip4: 10.1.0.101 + iocage_ip6: '-' + iocage_jid: '-' + iocage_properties: + CONFIG_VERSION: '28' + allow_chflags: '0' + allow_mlock: '0' + allow_mount: '0' + allow_mount_devfs: '0' + allow_mount_fusefs: '0' + allow_mount_nullfs: '0' + allow_mount_procfs: '0' + allow_mount_tmpfs: '0' + allow_mount_zfs: '0' + allow_quotas: '0' + allow_raw_sockets: '0' + allow_set_hostname: '1' + allow_socket_af: '0' + allow_sysvipc: '0' + allow_tun: '0' + allow_vmm: '0' + assign_localhost: '0' + available: readonly + basejail: '1' + boot: '0' + bpf: '0' + children_max: '0' + comment: none + compression: lz4 + compressratio: readonly + coredumpsize: 'off' + count: '1' + cpuset: 'off' + cputime: 'off' + datasize: 'off' + dedup: 'off' + defaultrouter: 10.1.0.10 + defaultrouter6: auto + depends: none + devfs_ruleset: '4' + dhcp: '0' + enforce_statfs: '2' + exec_clean: '1' + exec_created: /usr/bin/true + exec_fib: '0' + exec_jail_user: root + exec_poststart: /usr/bin/true + exec_poststop: /usr/bin/true + exec_prestart: /usr/bin/true + exec_prestop: /usr/bin/true + exec_start: /bin/sh /etc/rc + exec_stop: /bin/sh /etc/rc.shutdown + exec_system_jail_user: '0' + exec_system_user: root + exec_timeout: '60' + host_domainname: none + host_hostname: ansible-client + host_hostuuid: test_101 + host_time: '1' + hostid: 34333834-3734-5a43-3331-313342464631 + hostid_strict_check: '0' + interfaces: vnet0:bridge0 + ip4: new + ip4_addr: vnet0|10.1.0.101/24 + ip4_saddrsel: '1' + ip6: new + ip6_addr: none + ip6_saddrsel: '1' + ip_hostname: '0' + jail_zfs: '0' + jail_zfs_dataset: iocage/jails/test_101/data + jail_zfs_mountpoint: none + last_started: none + localhost_ip: none + login_flags: -f root + mac_prefix: 3e4a92 + maxproc: 'off' + memorylocked: 'off' + memoryuse: 'off' + min_dyn_devfs_ruleset: '1000' + mount_devfs: '1' + mount_fdescfs: '1' + mount_linprocfs: '0' + mount_procfs: '0' + mountpoint: readonly + msgqqueued: 'off' + msgqsize: 'off' + nat: '0' + nat_backend: ipfw + nat_forwards: none + nat_interface: none + nat_prefix: '172.16' + nmsgq: 'off' + notes: vmm=iocage_01 + nsem: 'off' + nsemop: 'off' + nshm: 'off' + nthr: 'off' + openfiles: 'off' + origin: readonly + owner: root + pcpu: 'off' + plugin_name: none + plugin_repository: none + priority: '99' + pseudoterminals: 'off' + quota: none + readbps: 'off' + readiops: 'off' + release: 13.4-RELEASE-p2 + reservation: none + resolver: /etc/resolv.conf + rlimits: 'off' + rtsold: '0' + securelevel: '2' + shmsize: 'off' + stacksize: 'off' + state: down + stop_timeout: '30' + swapuse: 'off' + sync_state: none + sync_target: none + sync_tgt_zpool: none + sysvmsg: new + sysvsem: new + sysvshm: new + template: '0' + type: jail + used: readonly + vmemoryuse: 'off' + vnet: '1' + vnet0_mac: none + vnet0_mtu: auto + vnet1_mac: none + vnet1_mtu: auto + vnet2_mac: none + vnet2_mtu: auto + vnet3_mac: none + vnet3_mtu: auto + vnet_default_interface: auto + vnet_default_mtu: '1500' + vnet_interfaces: none + wallclock: 'off' + writebps: 'off' + writeiops: 'off' + iocage_release: 13.4-RELEASE-p2 + iocage_state: down + iocage_template: ansible_client + iocage_type: jail + test_102: + iocage_basejail: 'yes' + iocage_boot: 'off' + iocage_ip4: 10.1.0.102 + iocage_ip6: '-' + iocage_jid: '-' + iocage_properties: + CONFIG_VERSION: '28' + allow_chflags: '0' + allow_mlock: '0' + allow_mount: '0' + allow_mount_devfs: '0' + allow_mount_fusefs: '0' + allow_mount_nullfs: '0' + allow_mount_procfs: '0' + allow_mount_tmpfs: '0' + allow_mount_zfs: '0' + allow_quotas: '0' + allow_raw_sockets: '0' + allow_set_hostname: '1' + allow_socket_af: '0' + allow_sysvipc: '0' + allow_tun: '0' + allow_vmm: '0' + assign_localhost: '0' + available: readonly + basejail: '1' + boot: '0' + bpf: '0' + children_max: '0' + comment: none + compression: lz4 + compressratio: readonly + coredumpsize: 'off' + count: '1' + cpuset: 'off' + cputime: 'off' + datasize: 'off' + dedup: 'off' + defaultrouter: 10.1.0.10 + defaultrouter6: auto + depends: none + devfs_ruleset: '4' + dhcp: '0' + enforce_statfs: '2' + exec_clean: '1' + exec_created: /usr/bin/true + exec_fib: '0' + exec_jail_user: root + exec_poststart: /usr/bin/true + exec_poststop: /usr/bin/true + exec_prestart: /usr/bin/true + exec_prestop: /usr/bin/true + exec_start: /bin/sh /etc/rc + exec_stop: /bin/sh /etc/rc.shutdown + exec_system_jail_user: '0' + exec_system_user: root + exec_timeout: '60' + host_domainname: none + host_hostname: ansible-client + host_hostuuid: test_102 + host_time: '1' + hostid: 34333834-3734-5a43-3331-313342464631 + hostid_strict_check: '0' + interfaces: vnet0:bridge0 + ip4: new + ip4_addr: vnet0|10.1.0.102/24 + ip4_saddrsel: '1' + ip6: new + ip6_addr: none + ip6_saddrsel: '1' + ip_hostname: '0' + jail_zfs: '0' + jail_zfs_dataset: iocage/jails/test_102/data + jail_zfs_mountpoint: none + last_started: none + localhost_ip: none + login_flags: -f root + mac_prefix: 3e4a92 + maxproc: 'off' + memorylocked: 'off' + memoryuse: 'off' + min_dyn_devfs_ruleset: '1000' + mount_devfs: '1' + mount_fdescfs: '1' + mount_linprocfs: '0' + mount_procfs: '0' + mountpoint: readonly + msgqqueued: 'off' + msgqsize: 'off' + nat: '0' + nat_backend: ipfw + nat_forwards: none + nat_interface: none + nat_prefix: '172.16' + nmsgq: 'off' + notes: vmm=iocage_01 + nsem: 'off' + nsemop: 'off' + nshm: 'off' + nthr: 'off' + openfiles: 'off' + origin: readonly + owner: root + pcpu: 'off' + plugin_name: none + plugin_repository: none + priority: '99' + pseudoterminals: 'off' + quota: none + readbps: 'off' + readiops: 'off' + release: 13.4-RELEASE-p2 + reservation: none + resolver: /etc/resolv.conf + rlimits: 'off' + rtsold: '0' + securelevel: '2' + shmsize: 'off' + stacksize: 'off' + state: down + stop_timeout: '30' + swapuse: 'off' + sync_state: none + sync_target: none + sync_tgt_zpool: none + sysvmsg: new + sysvsem: new + sysvshm: new + template: '0' + type: jail + used: readonly + vmemoryuse: 'off' + vnet: '1' + vnet0_mac: none + vnet0_mtu: auto + vnet1_mac: none + vnet1_mtu: auto + vnet2_mac: none + vnet2_mtu: auto + vnet3_mac: none + vnet3_mtu: auto + vnet_default_interface: auto + vnet_default_mtu: '1500' + vnet_interfaces: none + wallclock: 'off' + writebps: 'off' + writeiops: 'off' + iocage_release: 13.4-RELEASE-p2 + iocage_state: down + iocage_template: ansible_client + iocage_type: jail + test_103: + iocage_basejail: 'yes' + iocage_boot: 'off' + iocage_ip4: 10.1.0.103 + iocage_ip6: '-' + iocage_jid: '-' + iocage_properties: + CONFIG_VERSION: '28' + allow_chflags: '0' + allow_mlock: '0' + allow_mount: '0' + allow_mount_devfs: '0' + allow_mount_fusefs: '0' + allow_mount_nullfs: '0' + allow_mount_procfs: '0' + allow_mount_tmpfs: '0' + allow_mount_zfs: '0' + allow_quotas: '0' + allow_raw_sockets: '0' + allow_set_hostname: '1' + allow_socket_af: '0' + allow_sysvipc: '0' + allow_tun: '0' + allow_vmm: '0' + assign_localhost: '0' + available: readonly + basejail: '1' + boot: '0' + bpf: '0' + children_max: '0' + comment: none + compression: lz4 + compressratio: readonly + coredumpsize: 'off' + count: '1' + cpuset: 'off' + cputime: 'off' + datasize: 'off' + dedup: 'off' + defaultrouter: 10.1.0.10 + defaultrouter6: auto + depends: none + devfs_ruleset: '4' + dhcp: '0' + enforce_statfs: '2' + exec_clean: '1' + exec_created: /usr/bin/true + exec_fib: '0' + exec_jail_user: root + exec_poststart: /usr/bin/true + exec_poststop: /usr/bin/true + exec_prestart: /usr/bin/true + exec_prestop: /usr/bin/true + exec_start: /bin/sh /etc/rc + exec_stop: /bin/sh /etc/rc.shutdown + exec_system_jail_user: '0' + exec_system_user: root + exec_timeout: '60' + host_domainname: none + host_hostname: ansible-client + host_hostuuid: test_103 + host_time: '1' + hostid: 34333834-3734-5a43-3331-313342464631 + hostid_strict_check: '0' + interfaces: vnet0:bridge0 + ip4: new + ip4_addr: vnet0|10.1.0.103/24 + ip4_saddrsel: '1' + ip6: new + ip6_addr: none + ip6_saddrsel: '1' + ip_hostname: '0' + jail_zfs: '0' + jail_zfs_dataset: iocage/jails/test_103/data + jail_zfs_mountpoint: none + last_started: none + localhost_ip: none + login_flags: -f root + mac_prefix: 3e4a92 + maxproc: 'off' + memorylocked: 'off' + memoryuse: 'off' + min_dyn_devfs_ruleset: '1000' + mount_devfs: '1' + mount_fdescfs: '1' + mount_linprocfs: '0' + mount_procfs: '0' + mountpoint: readonly + msgqqueued: 'off' + msgqsize: 'off' + nat: '0' + nat_backend: ipfw + nat_forwards: none + nat_interface: none + nat_prefix: '172.16' + nmsgq: 'off' + notes: vmm=iocage_01 + nsem: 'off' + nsemop: 'off' + nshm: 'off' + nthr: 'off' + openfiles: 'off' + origin: readonly + owner: root + pcpu: 'off' + plugin_name: none + plugin_repository: none + priority: '99' + pseudoterminals: 'off' + quota: none + readbps: 'off' + readiops: 'off' + release: 13.4-RELEASE-p2 + reservation: none + resolver: /etc/resolv.conf + rlimits: 'off' + rtsold: '0' + securelevel: '2' + shmsize: 'off' + stacksize: 'off' + state: down + stop_timeout: '30' + swapuse: 'off' + sync_state: none + sync_target: none + sync_tgt_zpool: none + sysvmsg: new + sysvsem: new + sysvshm: new + template: '0' + type: jail + used: readonly + vmemoryuse: 'off' + vnet: '1' + vnet0_mac: none + vnet0_mtu: auto + vnet1_mac: none + vnet1_mtu: auto + vnet2_mac: none + vnet2_mtu: auto + vnet3_mac: none + vnet3_mtu: auto + vnet_default_interface: auto + vnet_default_mtu: '1500' + vnet_interfaces: none + wallclock: 'off' + writebps: 'off' + writeiops: 'off' + iocage_release: 13.4-RELEASE-p2 + iocage_state: down + iocage_template: ansible_client + iocage_type: jail diff --git a/tests/unit/plugins/inventory/fixtures/iocage_inventory.yml.license b/tests/unit/plugins/inventory/fixtures/iocage_inventory.yml.license new file mode 100644 index 00000000000..edff8c7685d --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_inventory.yml.license @@ -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 diff --git a/tests/unit/plugins/inventory/fixtures/iocage_jails.txt b/tests/unit/plugins/inventory/fixtures/iocage_jails.txt new file mode 100644 index 00000000000..51521105500 --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_jails.txt @@ -0,0 +1,3 @@ +- 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 diff --git a/tests/unit/plugins/inventory/fixtures/iocage_jails.txt.license b/tests/unit/plugins/inventory/fixtures/iocage_jails.txt.license new file mode 100644 index 00000000000..edff8c7685d --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_jails.txt.license @@ -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 diff --git a/tests/unit/plugins/inventory/fixtures/iocage_jails.yml b/tests/unit/plugins/inventory/fixtures/iocage_jails.yml new file mode 100644 index 00000000000..08eaa2dce4b --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_jails.yml @@ -0,0 +1,32 @@ +_meta: + hostvars: + test_101: + iocage_basejail: 'yes' + iocage_boot: 'off' + iocage_ip4: 10.1.0.101 + iocage_ip6: '-' + iocage_jid: '-' + iocage_release: 13.4-RELEASE-p2 + iocage_state: down + iocage_template: ansible_client + iocage_type: jail + test_102: + iocage_basejail: 'yes' + iocage_boot: 'off' + iocage_ip4: 10.1.0.102 + iocage_ip6: '-' + iocage_jid: '-' + iocage_release: 13.4-RELEASE-p2 + iocage_state: down + iocage_template: ansible_client + iocage_type: jail + test_103: + iocage_basejail: 'yes' + iocage_boot: 'off' + iocage_ip4: 10.1.0.103 + iocage_ip6: '-' + iocage_jid: '-' + iocage_release: 13.4-RELEASE-p2 + iocage_state: down + iocage_template: ansible_client + iocage_type: jail diff --git a/tests/unit/plugins/inventory/fixtures/iocage_jails.yml.license b/tests/unit/plugins/inventory/fixtures/iocage_jails.yml.license new file mode 100644 index 00000000000..edff8c7685d --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_jails.yml.license @@ -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 diff --git a/tests/unit/plugins/inventory/fixtures/iocage_properties.txt b/tests/unit/plugins/inventory/fixtures/iocage_properties.txt new file mode 100644 index 00000000000..a24c8959eed --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_properties.txt @@ -0,0 +1,11 @@ +CONFIG_VERSION:28 +notes:abbridged_properties +allow_chflags:0 +allow_mlock:0 +allow_mount:0 +allow_mount_devfs:0 +allow_mount_fusefs:0 +allow_mount_nullfs:0 +allow_mount_procfs:0 +allow_mount_tmpfs:0 +allow_mount_zfs:0 diff --git a/tests/unit/plugins/inventory/fixtures/iocage_properties.txt.license b/tests/unit/plugins/inventory/fixtures/iocage_properties.txt.license new file mode 100644 index 00000000000..edff8c7685d --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_properties.txt.license @@ -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 diff --git a/tests/unit/plugins/inventory/fixtures/iocage_properties.yml b/tests/unit/plugins/inventory/fixtures/iocage_properties.yml new file mode 100644 index 00000000000..ffae1bf9d17 --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_properties.yml @@ -0,0 +1,458 @@ +_meta: + hostvars: + test_101: + iocage_basejail: 'yes' + iocage_boot: 'off' + iocage_ip4: 10.1.0.101 + iocage_ip6: '-' + iocage_jid: '-' + iocage_properties: + CONFIG_VERSION: '28' + allow_chflags: '0' + allow_mlock: '0' + allow_mount: '0' + allow_mount_devfs: '0' + allow_mount_fusefs: '0' + allow_mount_nullfs: '0' + allow_mount_procfs: '0' + allow_mount_tmpfs: '0' + allow_mount_zfs: '0' + allow_quotas: '0' + allow_raw_sockets: '0' + allow_set_hostname: '1' + allow_socket_af: '0' + allow_sysvipc: '0' + allow_tun: '0' + allow_vmm: '0' + assign_localhost: '0' + available: readonly + basejail: '1' + boot: '0' + bpf: '0' + children_max: '0' + comment: none + compression: lz4 + compressratio: readonly + coredumpsize: 'off' + count: '1' + cpuset: 'off' + cputime: 'off' + datasize: 'off' + dedup: 'off' + defaultrouter: 10.1.0.10 + defaultrouter6: auto + depends: none + devfs_ruleset: '4' + dhcp: '0' + enforce_statfs: '2' + exec_clean: '1' + exec_created: /usr/bin/true + exec_fib: '0' + exec_jail_user: root + exec_poststart: /usr/bin/true + exec_poststop: /usr/bin/true + exec_prestart: /usr/bin/true + exec_prestop: /usr/bin/true + exec_start: /bin/sh /etc/rc + exec_stop: /bin/sh /etc/rc.shutdown + exec_system_jail_user: '0' + exec_system_user: root + exec_timeout: '60' + host_domainname: none + host_hostname: ansible-client + host_hostuuid: test_101 + host_time: '1' + hostid: 34333834-3734-5a43-3331-313342464631 + hostid_strict_check: '0' + interfaces: vnet0:bridge0 + ip4: new + ip4_addr: vnet0|10.1.0.101/24 + ip4_saddrsel: '1' + ip6: new + ip6_addr: none + ip6_saddrsel: '1' + ip_hostname: '0' + jail_zfs: '0' + jail_zfs_dataset: iocage/jails/test_101/data + jail_zfs_mountpoint: none + last_started: none + localhost_ip: none + login_flags: -f root + mac_prefix: 3e4a92 + maxproc: 'off' + memorylocked: 'off' + memoryuse: 'off' + min_dyn_devfs_ruleset: '1000' + mount_devfs: '1' + mount_fdescfs: '1' + mount_linprocfs: '0' + mount_procfs: '0' + mountpoint: readonly + msgqqueued: 'off' + msgqsize: 'off' + nat: '0' + nat_backend: ipfw + nat_forwards: none + nat_interface: none + nat_prefix: '172.16' + nmsgq: 'off' + notes: vmm=iocage_01 + nsem: 'off' + nsemop: 'off' + nshm: 'off' + nthr: 'off' + openfiles: 'off' + origin: readonly + owner: root + pcpu: 'off' + plugin_name: none + plugin_repository: none + priority: '99' + pseudoterminals: 'off' + quota: none + readbps: 'off' + readiops: 'off' + release: 13.4-RELEASE-p2 + reservation: none + resolver: /etc/resolv.conf + rlimits: 'off' + rtsold: '0' + securelevel: '2' + shmsize: 'off' + stacksize: 'off' + state: down + stop_timeout: '30' + swapuse: 'off' + sync_state: none + sync_target: none + sync_tgt_zpool: none + sysvmsg: new + sysvsem: new + sysvshm: new + template: '0' + type: jail + used: readonly + vmemoryuse: 'off' + vnet: '1' + vnet0_mac: none + vnet0_mtu: auto + vnet1_mac: none + vnet1_mtu: auto + vnet2_mac: none + vnet2_mtu: auto + vnet3_mac: none + vnet3_mtu: auto + vnet_default_interface: auto + vnet_default_mtu: '1500' + vnet_interfaces: none + wallclock: 'off' + writebps: 'off' + writeiops: 'off' + iocage_release: 13.4-RELEASE-p2 + iocage_state: down + iocage_template: ansible_client + iocage_type: jail + test_102: + iocage_basejail: 'yes' + iocage_boot: 'off' + iocage_ip4: 10.1.0.102 + iocage_ip6: '-' + iocage_jid: '-' + iocage_properties: + CONFIG_VERSION: '28' + allow_chflags: '0' + allow_mlock: '0' + allow_mount: '0' + allow_mount_devfs: '0' + allow_mount_fusefs: '0' + allow_mount_nullfs: '0' + allow_mount_procfs: '0' + allow_mount_tmpfs: '0' + allow_mount_zfs: '0' + allow_quotas: '0' + allow_raw_sockets: '0' + allow_set_hostname: '1' + allow_socket_af: '0' + allow_sysvipc: '0' + allow_tun: '0' + allow_vmm: '0' + assign_localhost: '0' + available: readonly + basejail: '1' + boot: '0' + bpf: '0' + children_max: '0' + comment: none + compression: lz4 + compressratio: readonly + coredumpsize: 'off' + count: '1' + cpuset: 'off' + cputime: 'off' + datasize: 'off' + dedup: 'off' + defaultrouter: 10.1.0.10 + defaultrouter6: auto + depends: none + devfs_ruleset: '4' + dhcp: '0' + enforce_statfs: '2' + exec_clean: '1' + exec_created: /usr/bin/true + exec_fib: '0' + exec_jail_user: root + exec_poststart: /usr/bin/true + exec_poststop: /usr/bin/true + exec_prestart: /usr/bin/true + exec_prestop: /usr/bin/true + exec_start: /bin/sh /etc/rc + exec_stop: /bin/sh /etc/rc.shutdown + exec_system_jail_user: '0' + exec_system_user: root + exec_timeout: '60' + host_domainname: none + host_hostname: ansible-client + host_hostuuid: test_102 + host_time: '1' + hostid: 34333834-3734-5a43-3331-313342464631 + hostid_strict_check: '0' + interfaces: vnet0:bridge0 + ip4: new + ip4_addr: vnet0|10.1.0.102/24 + ip4_saddrsel: '1' + ip6: new + ip6_addr: none + ip6_saddrsel: '1' + ip_hostname: '0' + jail_zfs: '0' + jail_zfs_dataset: iocage/jails/test_102/data + jail_zfs_mountpoint: none + last_started: none + localhost_ip: none + login_flags: -f root + mac_prefix: 3e4a92 + maxproc: 'off' + memorylocked: 'off' + memoryuse: 'off' + min_dyn_devfs_ruleset: '1000' + mount_devfs: '1' + mount_fdescfs: '1' + mount_linprocfs: '0' + mount_procfs: '0' + mountpoint: readonly + msgqqueued: 'off' + msgqsize: 'off' + nat: '0' + nat_backend: ipfw + nat_forwards: none + nat_interface: none + nat_prefix: '172.16' + nmsgq: 'off' + notes: vmm=iocage_01 + nsem: 'off' + nsemop: 'off' + nshm: 'off' + nthr: 'off' + openfiles: 'off' + origin: readonly + owner: root + pcpu: 'off' + plugin_name: none + plugin_repository: none + priority: '99' + pseudoterminals: 'off' + quota: none + readbps: 'off' + readiops: 'off' + release: 13.4-RELEASE-p2 + reservation: none + resolver: /etc/resolv.conf + rlimits: 'off' + rtsold: '0' + securelevel: '2' + shmsize: 'off' + stacksize: 'off' + state: down + stop_timeout: '30' + swapuse: 'off' + sync_state: none + sync_target: none + sync_tgt_zpool: none + sysvmsg: new + sysvsem: new + sysvshm: new + template: '0' + type: jail + used: readonly + vmemoryuse: 'off' + vnet: '1' + vnet0_mac: none + vnet0_mtu: auto + vnet1_mac: none + vnet1_mtu: auto + vnet2_mac: none + vnet2_mtu: auto + vnet3_mac: none + vnet3_mtu: auto + vnet_default_interface: auto + vnet_default_mtu: '1500' + vnet_interfaces: none + wallclock: 'off' + writebps: 'off' + writeiops: 'off' + iocage_release: 13.4-RELEASE-p2 + iocage_state: down + iocage_template: ansible_client + iocage_type: jail + test_103: + iocage_basejail: 'yes' + iocage_boot: 'off' + iocage_ip4: 10.1.0.103 + iocage_ip6: '-' + iocage_jid: '-' + iocage_properties: + CONFIG_VERSION: '28' + allow_chflags: '0' + allow_mlock: '0' + allow_mount: '0' + allow_mount_devfs: '0' + allow_mount_fusefs: '0' + allow_mount_nullfs: '0' + allow_mount_procfs: '0' + allow_mount_tmpfs: '0' + allow_mount_zfs: '0' + allow_quotas: '0' + allow_raw_sockets: '0' + allow_set_hostname: '1' + allow_socket_af: '0' + allow_sysvipc: '0' + allow_tun: '0' + allow_vmm: '0' + assign_localhost: '0' + available: readonly + basejail: '1' + boot: '0' + bpf: '0' + children_max: '0' + comment: none + compression: lz4 + compressratio: readonly + coredumpsize: 'off' + count: '1' + cpuset: 'off' + cputime: 'off' + datasize: 'off' + dedup: 'off' + defaultrouter: 10.1.0.10 + defaultrouter6: auto + depends: none + devfs_ruleset: '4' + dhcp: '0' + enforce_statfs: '2' + exec_clean: '1' + exec_created: /usr/bin/true + exec_fib: '0' + exec_jail_user: root + exec_poststart: /usr/bin/true + exec_poststop: /usr/bin/true + exec_prestart: /usr/bin/true + exec_prestop: /usr/bin/true + exec_start: /bin/sh /etc/rc + exec_stop: /bin/sh /etc/rc.shutdown + exec_system_jail_user: '0' + exec_system_user: root + exec_timeout: '60' + host_domainname: none + host_hostname: ansible-client + host_hostuuid: test_103 + host_time: '1' + hostid: 34333834-3734-5a43-3331-313342464631 + hostid_strict_check: '0' + interfaces: vnet0:bridge0 + ip4: new + ip4_addr: vnet0|10.1.0.103/24 + ip4_saddrsel: '1' + ip6: new + ip6_addr: none + ip6_saddrsel: '1' + ip_hostname: '0' + jail_zfs: '0' + jail_zfs_dataset: iocage/jails/test_103/data + jail_zfs_mountpoint: none + last_started: none + localhost_ip: none + login_flags: -f root + mac_prefix: 3e4a92 + maxproc: 'off' + memorylocked: 'off' + memoryuse: 'off' + min_dyn_devfs_ruleset: '1000' + mount_devfs: '1' + mount_fdescfs: '1' + mount_linprocfs: '0' + mount_procfs: '0' + mountpoint: readonly + msgqqueued: 'off' + msgqsize: 'off' + nat: '0' + nat_backend: ipfw + nat_forwards: none + nat_interface: none + nat_prefix: '172.16' + nmsgq: 'off' + notes: vmm=iocage_01 + nsem: 'off' + nsemop: 'off' + nshm: 'off' + nthr: 'off' + openfiles: 'off' + origin: readonly + owner: root + pcpu: 'off' + plugin_name: none + plugin_repository: none + priority: '99' + pseudoterminals: 'off' + quota: none + readbps: 'off' + readiops: 'off' + release: 13.4-RELEASE-p2 + reservation: none + resolver: /etc/resolv.conf + rlimits: 'off' + rtsold: '0' + securelevel: '2' + shmsize: 'off' + stacksize: 'off' + state: down + stop_timeout: '30' + swapuse: 'off' + sync_state: none + sync_target: none + sync_tgt_zpool: none + sysvmsg: new + sysvsem: new + sysvshm: new + template: '0' + type: jail + used: readonly + vmemoryuse: 'off' + vnet: '1' + vnet0_mac: none + vnet0_mtu: auto + vnet1_mac: none + vnet1_mtu: auto + vnet2_mac: none + vnet2_mtu: auto + vnet3_mac: none + vnet3_mtu: auto + vnet_default_interface: auto + vnet_default_mtu: '1500' + vnet_interfaces: none + wallclock: 'off' + writebps: 'off' + writeiops: 'off' + iocage_release: 13.4-RELEASE-p2 + iocage_state: down + iocage_template: ansible_client + iocage_type: jail diff --git a/tests/unit/plugins/inventory/fixtures/iocage_properties.yml.license b/tests/unit/plugins/inventory/fixtures/iocage_properties.yml.license new file mode 100644 index 00000000000..edff8c7685d --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_properties.yml.license @@ -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 diff --git a/tests/unit/plugins/inventory/fixtures/iocage_properties_test_101.txt b/tests/unit/plugins/inventory/fixtures/iocage_properties_test_101.txt new file mode 100644 index 00000000000..881f3479119 --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_properties_test_101.txt @@ -0,0 +1,141 @@ +CONFIG_VERSION:28 +allow_chflags:0 +allow_mlock:0 +allow_mount:0 +allow_mount_devfs:0 +allow_mount_fusefs:0 +allow_mount_nullfs:0 +allow_mount_procfs:0 +allow_mount_tmpfs:0 +allow_mount_zfs:0 +allow_quotas:0 +allow_raw_sockets:0 +allow_set_hostname:1 +allow_socket_af:0 +allow_sysvipc:0 +allow_tun:0 +allow_vmm:0 +assign_localhost:0 +available:readonly +basejail:1 +boot:0 +bpf:0 +children_max:0 +comment:none +compression:lz4 +compressratio:readonly +coredumpsize:off +count:1 +cpuset:off +cputime:off +datasize:off +dedup:off +defaultrouter:10.1.0.10 +defaultrouter6:auto +depends:none +devfs_ruleset:4 +dhcp:0 +enforce_statfs:2 +exec_clean:1 +exec_created:/usr/bin/true +exec_fib:0 +exec_jail_user:root +exec_poststart:/usr/bin/true +exec_poststop:/usr/bin/true +exec_prestart:/usr/bin/true +exec_prestop:/usr/bin/true +exec_start:/bin/sh /etc/rc +exec_stop:/bin/sh /etc/rc.shutdown +exec_system_jail_user:0 +exec_system_user:root +exec_timeout:60 +host_domainname:none +host_hostname:ansible-client +host_hostuuid:test_101 +host_time:1 +hostid:34333834-3734-5a43-3331-313342464631 +hostid_strict_check:0 +interfaces:vnet0:bridge0 +ip4:new +ip4_addr:vnet0|10.1.0.101/24 +ip4_saddrsel:1 +ip6:new +ip6_addr:none +ip6_saddrsel:1 +ip_hostname:0 +jail_zfs:0 +jail_zfs_dataset:iocage/jails/test_101/data +jail_zfs_mountpoint:none +last_started:none +localhost_ip:none +login_flags:-f root +mac_prefix:3e4a92 +maxproc:off +memorylocked:off +memoryuse:off +min_dyn_devfs_ruleset:1000 +mount_devfs:1 +mount_fdescfs:1 +mount_linprocfs:0 +mount_procfs:0 +mountpoint:readonly +msgqqueued:off +msgqsize:off +nat:0 +nat_backend:ipfw +nat_forwards:none +nat_interface:none +nat_prefix:172.16 +nmsgq:off +notes:vmm=iocage_01 +nsem:off +nsemop:off +nshm:off +nthr:off +openfiles:off +origin:readonly +owner:root +pcpu:off +plugin_name:none +plugin_repository:none +priority:99 +pseudoterminals:off +quota:none +readbps:off +readiops:off +release:13.4-RELEASE-p2 +reservation:none +resolver:/etc/resolv.conf +rlimits:off +rtsold:0 +securelevel:2 +shmsize:off +stacksize:off +state:down +stop_timeout:30 +swapuse:off +sync_state:none +sync_target:none +sync_tgt_zpool:none +sysvmsg:new +sysvsem:new +sysvshm:new +template:0 +type:jail +used:readonly +vmemoryuse:off +vnet:1 +vnet0_mac:none +vnet0_mtu:auto +vnet1_mac:none +vnet1_mtu:auto +vnet2_mac:none +vnet2_mtu:auto +vnet3_mac:none +vnet3_mtu:auto +vnet_default_interface:auto +vnet_default_mtu:1500 +vnet_interfaces:none +wallclock:off +writebps:off +writeiops:off diff --git a/tests/unit/plugins/inventory/fixtures/iocage_properties_test_101.txt.license b/tests/unit/plugins/inventory/fixtures/iocage_properties_test_101.txt.license new file mode 100644 index 00000000000..edff8c7685d --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_properties_test_101.txt.license @@ -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 diff --git a/tests/unit/plugins/inventory/fixtures/iocage_properties_test_102.txt b/tests/unit/plugins/inventory/fixtures/iocage_properties_test_102.txt new file mode 100644 index 00000000000..065c777b9c6 --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_properties_test_102.txt @@ -0,0 +1,141 @@ +CONFIG_VERSION:28 +allow_chflags:0 +allow_mlock:0 +allow_mount:0 +allow_mount_devfs:0 +allow_mount_fusefs:0 +allow_mount_nullfs:0 +allow_mount_procfs:0 +allow_mount_tmpfs:0 +allow_mount_zfs:0 +allow_quotas:0 +allow_raw_sockets:0 +allow_set_hostname:1 +allow_socket_af:0 +allow_sysvipc:0 +allow_tun:0 +allow_vmm:0 +assign_localhost:0 +available:readonly +basejail:1 +boot:0 +bpf:0 +children_max:0 +comment:none +compression:lz4 +compressratio:readonly +coredumpsize:off +count:1 +cpuset:off +cputime:off +datasize:off +dedup:off +defaultrouter:10.1.0.10 +defaultrouter6:auto +depends:none +devfs_ruleset:4 +dhcp:0 +enforce_statfs:2 +exec_clean:1 +exec_created:/usr/bin/true +exec_fib:0 +exec_jail_user:root +exec_poststart:/usr/bin/true +exec_poststop:/usr/bin/true +exec_prestart:/usr/bin/true +exec_prestop:/usr/bin/true +exec_start:/bin/sh /etc/rc +exec_stop:/bin/sh /etc/rc.shutdown +exec_system_jail_user:0 +exec_system_user:root +exec_timeout:60 +host_domainname:none +host_hostname:ansible-client +host_hostuuid:test_102 +host_time:1 +hostid:34333834-3734-5a43-3331-313342464631 +hostid_strict_check:0 +interfaces:vnet0:bridge0 +ip4:new +ip4_addr:vnet0|10.1.0.102/24 +ip4_saddrsel:1 +ip6:new +ip6_addr:none +ip6_saddrsel:1 +ip_hostname:0 +jail_zfs:0 +jail_zfs_dataset:iocage/jails/test_102/data +jail_zfs_mountpoint:none +last_started:none +localhost_ip:none +login_flags:-f root +mac_prefix:3e4a92 +maxproc:off +memorylocked:off +memoryuse:off +min_dyn_devfs_ruleset:1000 +mount_devfs:1 +mount_fdescfs:1 +mount_linprocfs:0 +mount_procfs:0 +mountpoint:readonly +msgqqueued:off +msgqsize:off +nat:0 +nat_backend:ipfw +nat_forwards:none +nat_interface:none +nat_prefix:172.16 +nmsgq:off +notes:vmm=iocage_01 +nsem:off +nsemop:off +nshm:off +nthr:off +openfiles:off +origin:readonly +owner:root +pcpu:off +plugin_name:none +plugin_repository:none +priority:99 +pseudoterminals:off +quota:none +readbps:off +readiops:off +release:13.4-RELEASE-p2 +reservation:none +resolver:/etc/resolv.conf +rlimits:off +rtsold:0 +securelevel:2 +shmsize:off +stacksize:off +state:down +stop_timeout:30 +swapuse:off +sync_state:none +sync_target:none +sync_tgt_zpool:none +sysvmsg:new +sysvsem:new +sysvshm:new +template:0 +type:jail +used:readonly +vmemoryuse:off +vnet:1 +vnet0_mac:none +vnet0_mtu:auto +vnet1_mac:none +vnet1_mtu:auto +vnet2_mac:none +vnet2_mtu:auto +vnet3_mac:none +vnet3_mtu:auto +vnet_default_interface:auto +vnet_default_mtu:1500 +vnet_interfaces:none +wallclock:off +writebps:off +writeiops:off diff --git a/tests/unit/plugins/inventory/fixtures/iocage_properties_test_102.txt.license b/tests/unit/plugins/inventory/fixtures/iocage_properties_test_102.txt.license new file mode 100644 index 00000000000..edff8c7685d --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_properties_test_102.txt.license @@ -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 diff --git a/tests/unit/plugins/inventory/fixtures/iocage_properties_test_103.txt b/tests/unit/plugins/inventory/fixtures/iocage_properties_test_103.txt new file mode 100644 index 00000000000..0050a989f5d --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_properties_test_103.txt @@ -0,0 +1,141 @@ +CONFIG_VERSION:28 +allow_chflags:0 +allow_mlock:0 +allow_mount:0 +allow_mount_devfs:0 +allow_mount_fusefs:0 +allow_mount_nullfs:0 +allow_mount_procfs:0 +allow_mount_tmpfs:0 +allow_mount_zfs:0 +allow_quotas:0 +allow_raw_sockets:0 +allow_set_hostname:1 +allow_socket_af:0 +allow_sysvipc:0 +allow_tun:0 +allow_vmm:0 +assign_localhost:0 +available:readonly +basejail:1 +boot:0 +bpf:0 +children_max:0 +comment:none +compression:lz4 +compressratio:readonly +coredumpsize:off +count:1 +cpuset:off +cputime:off +datasize:off +dedup:off +defaultrouter:10.1.0.10 +defaultrouter6:auto +depends:none +devfs_ruleset:4 +dhcp:0 +enforce_statfs:2 +exec_clean:1 +exec_created:/usr/bin/true +exec_fib:0 +exec_jail_user:root +exec_poststart:/usr/bin/true +exec_poststop:/usr/bin/true +exec_prestart:/usr/bin/true +exec_prestop:/usr/bin/true +exec_start:/bin/sh /etc/rc +exec_stop:/bin/sh /etc/rc.shutdown +exec_system_jail_user:0 +exec_system_user:root +exec_timeout:60 +host_domainname:none +host_hostname:ansible-client +host_hostuuid:test_103 +host_time:1 +hostid:34333834-3734-5a43-3331-313342464631 +hostid_strict_check:0 +interfaces:vnet0:bridge0 +ip4:new +ip4_addr:vnet0|10.1.0.103/24 +ip4_saddrsel:1 +ip6:new +ip6_addr:none +ip6_saddrsel:1 +ip_hostname:0 +jail_zfs:0 +jail_zfs_dataset:iocage/jails/test_103/data +jail_zfs_mountpoint:none +last_started:none +localhost_ip:none +login_flags:-f root +mac_prefix:3e4a92 +maxproc:off +memorylocked:off +memoryuse:off +min_dyn_devfs_ruleset:1000 +mount_devfs:1 +mount_fdescfs:1 +mount_linprocfs:0 +mount_procfs:0 +mountpoint:readonly +msgqqueued:off +msgqsize:off +nat:0 +nat_backend:ipfw +nat_forwards:none +nat_interface:none +nat_prefix:172.16 +nmsgq:off +notes:vmm=iocage_01 +nsem:off +nsemop:off +nshm:off +nthr:off +openfiles:off +origin:readonly +owner:root +pcpu:off +plugin_name:none +plugin_repository:none +priority:99 +pseudoterminals:off +quota:none +readbps:off +readiops:off +release:13.4-RELEASE-p2 +reservation:none +resolver:/etc/resolv.conf +rlimits:off +rtsold:0 +securelevel:2 +shmsize:off +stacksize:off +state:down +stop_timeout:30 +swapuse:off +sync_state:none +sync_target:none +sync_tgt_zpool:none +sysvmsg:new +sysvsem:new +sysvshm:new +template:0 +type:jail +used:readonly +vmemoryuse:off +vnet:1 +vnet0_mac:none +vnet0_mtu:auto +vnet1_mac:none +vnet1_mtu:auto +vnet2_mac:none +vnet2_mtu:auto +vnet3_mac:none +vnet3_mtu:auto +vnet_default_interface:auto +vnet_default_mtu:1500 +vnet_interfaces:none +wallclock:off +writebps:off +writeiops:off diff --git a/tests/unit/plugins/inventory/fixtures/iocage_properties_test_103.txt.license b/tests/unit/plugins/inventory/fixtures/iocage_properties_test_103.txt.license new file mode 100644 index 00000000000..edff8c7685d --- /dev/null +++ b/tests/unit/plugins/inventory/fixtures/iocage_properties_test_103.txt.license @@ -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 diff --git a/tests/unit/plugins/inventory/test_iocage.py b/tests/unit/plugins/inventory/test_iocage.py new file mode 100644 index 00000000000..1a0aa22d16d --- /dev/null +++ b/tests/unit/plugins/inventory/test_iocage.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2024 Vladimir Botka +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import pytest +import yaml + +from ansible.inventory.data import InventoryData +from ansible.template import Templar +from ansible_collections.community.general.plugins.inventory.iocage import InventoryModule + + +@pytest.fixture +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.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') + return inv + + +def load_txt_data(path): + f = open(path, 'r') + s = f.read() + f.close() + return s + + +def load_yml_data(path): + f = open(path, 'r') + d = yaml.safe_load(f) + f.close() + return d + + +def get_option(option): + groups = {} + groups['test'] = "inventory_hostname.startswith('test')" + + if option == 'groups': + return groups + elif option == 'keyed_groups': + return [] + elif option == 'compose': + return {} + elif option == 'strict': + return False + else: + return None + + +def test_verify_file_bad_config(inventory): + assert inventory.verify_file('foobar.iocage.yml') is False + + +def test_verify_file(tmp_path, inventory): + file = tmp_path / "foobar.iocage.yml" + file.touch() + assert inventory.verify_file(str(file)) + + +def test_get_jails(inventory): + results = {'_meta': {'hostvars': {}}} + inventory.get_jails(inventory.jails, results) + assert results == inventory.js_ok + + +def test_get_properties(inventory): + results = {'_meta': {'hostvars': {}}} + inventory.get_jails(inventory.jails, results) + for hostname, host_vars in results['_meta']['hostvars'].items(): + inventory.get_properties(inventory.prpts[hostname], results, hostname) + assert results == inventory.ps_ok + + +def test_populate(inventory, mocker): + results = {'_meta': {'hostvars': {}}} + inventory.get_jails(inventory.jails, results) + for hostname, host_vars in results['_meta']['hostvars'].items(): + inventory.get_properties(inventory.prpts[hostname], results, hostname) + inventory.get_option = mocker.MagicMock(side_effect=get_option) + inventory.populate(results) + + # test + hosts = ('test_101', 'test_102', 'test_103') + vars = ('iocage_basejail', 'iocage_boot', 'iocage_ip4', 'iocage_ip6', 'iocage_properties', + 'iocage_release', 'iocage_state', 'iocage_template', 'iocage_type') + + # test host_vars + for host in hosts: + h = inventory.inventory.get_host(host) + for var in vars: + assert inventory.ok['all']['children']['test']['hosts'][host][var] == h.get_vars()[var] + + # test groups + test_101_info = inventory.inventory.get_host('test_101') + test_102_info = inventory.inventory.get_host('test_102') + test_103_info = inventory.inventory.get_host('test_103') + g = inventory.inventory.groups['test'] + assert g.hosts == [test_101_info, test_102_info, test_103_info]