1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2026-04-27 14:08:53 +00:00

Reformat everything.

This commit is contained in:
Felix Fontein 2025-11-01 12:08:41 +01:00
parent 3f2213791a
commit 340ff8586d
1008 changed files with 61301 additions and 58309 deletions

View file

@ -85,9 +85,9 @@ from ansible_collections.community.general.plugins.plugin_utils.unsafe import ma
class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
''' Host inventory parser for ansible using local virtualbox. '''
"""Host inventory parser for ansible using local virtualbox."""
NAME = 'community.general.virtualbox'
NAME = "community.general.virtualbox"
VBOX = "VBoxManage"
def __init__(self):
@ -97,56 +97,58 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
def _query_vbox_data(self, host, property_path):
ret = None
try:
cmd = [self._vbox_path, b'guestproperty', b'get',
to_bytes(host, errors='surrogate_or_strict'),
to_bytes(property_path, errors='surrogate_or_strict')]
cmd = [
self._vbox_path,
b"guestproperty",
b"get",
to_bytes(host, errors="surrogate_or_strict"),
to_bytes(property_path, errors="surrogate_or_strict"),
]
x = Popen(cmd, stdout=PIPE)
ipinfo = to_text(x.stdout.read(), errors='surrogate_or_strict')
if 'Value' in ipinfo:
a, ip = ipinfo.split(':', 1)
ipinfo = to_text(x.stdout.read(), errors="surrogate_or_strict")
if "Value" in ipinfo:
a, ip = ipinfo.split(":", 1)
ret = ip.strip()
except Exception:
pass
return ret
def _set_variables(self, hostvars):
# set vars in inventory from hostvars
for host in hostvars:
query = self.get_option('query')
query = self.get_option("query")
# create vars from vbox properties
if query and isinstance(query, MutableMapping):
for varname in query:
hostvars[host][varname] = self._query_vbox_data(host, query[varname])
strict = self.get_option('strict')
strict = self.get_option("strict")
# create composite vars
self._set_composite_vars(self.get_option('compose'), hostvars[host], host, strict=strict)
self._set_composite_vars(self.get_option("compose"), hostvars[host], host, strict=strict)
# actually update inventory
for key in hostvars[host]:
self.inventory.set_variable(host, key, hostvars[host][key])
# constructed groups based on conditionals
self._add_host_to_composed_groups(self.get_option('groups'), hostvars[host], host, strict=strict)
self._add_host_to_composed_groups(self.get_option("groups"), hostvars[host], host, strict=strict)
# constructed keyed_groups
self._add_host_to_keyed_groups(self.get_option('keyed_groups'), hostvars[host], host, strict=strict)
self._add_host_to_keyed_groups(self.get_option("keyed_groups"), hostvars[host], host, strict=strict)
def _populate_from_cache(self, source_data):
source_data = make_unsafe(source_data)
hostvars = source_data.pop('_meta', {}).get('hostvars', {})
hostvars = source_data.pop("_meta", {}).get("hostvars", {})
for group in source_data:
if group == 'all':
if group == "all":
continue
else:
group = self.inventory.add_group(group)
hosts = source_data[group].get('hosts', [])
hosts = source_data[group].get("hosts", [])
for host in hosts:
self._populate_host_vars([host], hostvars.get(host, {}), group)
self.inventory.add_child('all', group)
self.inventory.add_child("all", group)
if not source_data:
for host in hostvars:
self.inventory.add_host(host)
@ -157,32 +159,32 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
self._populate_from_cache(source_data)
return source_data
cacheable_results = {'_meta': {'hostvars': {}}}
cacheable_results = {"_meta": {"hostvars": {}}}
hostvars = {}
prevkey = pref_k = ''
prevkey = pref_k = ""
current_host = None
# needed to possibly set ansible_host
netinfo = self.get_option('network_info_path')
netinfo = self.get_option("network_info_path")
for line in source_data:
line = to_text(line)
if ':' not in line:
if ":" not in line:
continue
try:
k, v = line.split(':', 1)
k, v = line.split(":", 1)
except Exception:
# skip non splitable
continue
if k.strip() == '':
if k.strip() == "":
# skip empty
continue
v = v.strip()
# found host
if k.startswith('Name') and ',' not in v: # some setting strings appear in Name
if k.startswith("Name") and "," not in v: # some setting strings appear in Name
current_host = make_unsafe(v)
if current_host not in hostvars:
hostvars[current_host] = {}
@ -191,11 +193,11 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
# try to get network info
netdata = self._query_vbox_data(current_host, netinfo)
if netdata:
self.inventory.set_variable(current_host, 'ansible_host', make_unsafe(netdata))
self.inventory.set_variable(current_host, "ansible_host", make_unsafe(netdata))
# found groups
elif k == 'Groups':
if self.get_option('enable_advanced_group_parsing'):
elif k == "Groups":
if self.get_option("enable_advanced_group_parsing"):
self._handle_vboxmanage_group_string(v, current_host, cacheable_results)
else:
self._handle_group_string(v, current_host, cacheable_results)
@ -204,7 +206,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
else:
# found vars, accumulate in hostvars for clean inventory set
pref_k = make_unsafe(f"vbox_{k.strip().replace(' ', '_')}")
leading_spaces = len(k) - len(k.lstrip(' '))
leading_spaces = len(k) - len(k.lstrip(" "))
if 0 < leading_spaces <= 2:
if prevkey not in hostvars[current_host] or not isinstance(hostvars[current_host][prevkey], dict):
hostvars[current_host][prevkey] = {}
@ -212,26 +214,26 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
elif leading_spaces > 2:
continue
else:
if v != '':
if v != "":
hostvars[current_host][pref_k] = make_unsafe(v)
if self._ungrouped_host(current_host, cacheable_results):
if 'ungrouped' not in cacheable_results:
cacheable_results['ungrouped'] = {'hosts': []}
cacheable_results['ungrouped']['hosts'].append(current_host)
if "ungrouped" not in cacheable_results:
cacheable_results["ungrouped"] = {"hosts": []}
cacheable_results["ungrouped"]["hosts"].append(current_host)
prevkey = pref_k
self._set_variables(hostvars)
for host in hostvars:
h = self.inventory.get_host(host)
cacheable_results['_meta']['hostvars'][h.name] = h.vars
cacheable_results["_meta"]["hostvars"][h.name] = h.vars
return cacheable_results
def _ungrouped_host(self, host, inventory):
def find_host(host, inventory):
for k, v in inventory.items():
if k == '_meta':
if k == "_meta":
continue
if isinstance(v, dict):
yield self._ungrouped_host(host, v)
@ -242,20 +244,20 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
return all(find_host(host, inventory))
def _handle_group_string(self, vboxmanage_group, current_host, cacheable_results):
'''Handles parsing the VM's Group assignment from VBoxManage according to this inventory's initial implementation.'''
"""Handles parsing the VM's Group assignment from VBoxManage according to this inventory's initial implementation."""
# The original implementation of this inventory plugin treated `/` as
# a delimeter to split and use as Ansible Groups.
for group in vboxmanage_group.split('/'):
for group in vboxmanage_group.split("/"):
if group:
group = make_unsafe(group)
group = self.inventory.add_group(group)
self.inventory.add_child(group, current_host)
if group not in cacheable_results:
cacheable_results[group] = {'hosts': []}
cacheable_results[group]['hosts'].append(current_host)
cacheable_results[group] = {"hosts": []}
cacheable_results[group]["hosts"].append(current_host)
def _handle_vboxmanage_group_string(self, vboxmanage_group, current_host, cacheable_results):
'''Handles parsing the VM's Group assignment from VBoxManage according to VirtualBox documentation.'''
"""Handles parsing the VM's Group assignment from VBoxManage according to VirtualBox documentation."""
# Per the VirtualBox documentation, a VM can be part of many groups,
# and it is possible to have nested groups.
# Many groups are separated by commas ",", and nested groups use
@ -264,7 +266,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
# Multi groups: VBoxManage modifyvm "vm01" --groups "/TestGroup,/TestGroup2"
# Nested groups: VBoxManage modifyvm "vm01" --groups "/TestGroup/TestGroup2"
for group in vboxmanage_group.split(','):
for group in vboxmanage_group.split(","):
if not group:
# We could get an empty element due how to split works, and
# possible assignments from VirtualBox. e.g. ,/Group1
@ -277,13 +279,13 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
continue
parent_group = None
for subgroup in group.split('/'):
for subgroup in group.split("/"):
if not subgroup:
# Similarly to above, we could get an empty element.
# e.g //Group1
continue
if subgroup == '/':
if subgroup == "/":
# "root" group.
# Consider the host to be unassigned
continue
@ -294,21 +296,19 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
self.inventory.add_child(parent_group, subgroup)
self.inventory.add_child(subgroup, current_host)
if subgroup not in cacheable_results:
cacheable_results[subgroup] = {'hosts': []}
cacheable_results[subgroup]['hosts'].append(current_host)
cacheable_results[subgroup] = {"hosts": []}
cacheable_results[subgroup]["hosts"].append(current_host)
parent_group = subgroup
def verify_file(self, path):
valid = False
if super().verify_file(path):
if path.endswith(('virtualbox.yaml', 'virtualbox.yml', 'vbox.yaml', 'vbox.yml')):
if path.endswith(("virtualbox.yaml", "virtualbox.yml", "vbox.yaml", "vbox.yml")):
valid = True
return valid
def parse(self, inventory, loader, path, cache=True):
try:
self._vbox_path = get_bin_path(self.VBOX)
except ValueError as e:
@ -325,7 +325,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
source_data = None
if cache:
cache = self.get_option('cache')
cache = self.get_option("cache")
update_cache = False
if cache:
@ -335,18 +335,20 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
update_cache = True
if not source_data:
b_pwfile = to_bytes(self.get_option('settings_password_file'), errors='surrogate_or_strict', nonstring='passthru')
running = self.get_option('running_only')
b_pwfile = to_bytes(
self.get_option("settings_password_file"), errors="surrogate_or_strict", nonstring="passthru"
)
running = self.get_option("running_only")
# start getting data
cmd = [self._vbox_path, b'list', b'-l']
cmd = [self._vbox_path, b"list", b"-l"]
if running:
cmd.append(b'runningvms')
cmd.append(b"runningvms")
else:
cmd.append(b'vms')
cmd.append(b"vms")
if b_pwfile and os.path.exists(b_pwfile):
cmd.append(b'--settingspwfile')
cmd.append(b"--settingspwfile")
cmd.append(b_pwfile)
try: