[PR #9787/e8e3e5c2 backport][stable-10] Allow Xen Host and/or Xen VM names instead of their UUIDs (#9801)
Allow Xen Host and/or Xen VM names instead of their UUIDs (#9787)
* Allow using Xen Host and/or Xen VM names instead of their UUIDs for inventory
* xen_orchestra inventory plugin allow using vm and host names instead of UUID inventory
* Update changelog fragment with correct PR number
* Set missing inventory attributes in unit test
* Add version_added suggestion as per github comments
* Description update.
---------
Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit e8e3e5c2b0
)
Co-authored-by: rt-vnx <riordan.toms@vonex.com.au>
pull/9806/head
parent
5735c5a045
commit
27629b6497
|
@ -0,0 +1,2 @@
|
||||||
|
minor_changes:
|
||||||
|
- xen_orchestra inventory plugin - add ``use_vm_uuid`` and ``use_host_uuid`` boolean options to allow switching over to using VM/Xen name labels instead of UUIDs as item names (https://github.com/ansible-collections/community.general/pull/9787).
|
|
@ -57,6 +57,20 @@ DOCUMENTATION = '''
|
||||||
description: Use wss when connecting to the Xen Orchestra API
|
description: Use wss when connecting to the Xen Orchestra API
|
||||||
type: boolean
|
type: boolean
|
||||||
default: true
|
default: true
|
||||||
|
use_vm_uuid:
|
||||||
|
description:
|
||||||
|
- Import Xen VMs to inventory using their UUID as the VM entry name.
|
||||||
|
- If set to V(false) use VM name labels instead of UUIDs.
|
||||||
|
type: boolean
|
||||||
|
default: true
|
||||||
|
version_added: 10.4.0
|
||||||
|
use_host_uuid:
|
||||||
|
description:
|
||||||
|
- Import Xen Hosts to inventory using their UUID as the Host entry name.
|
||||||
|
- If set to V(false) use Host name labels instead of UUIDs.
|
||||||
|
type: boolean
|
||||||
|
default: true
|
||||||
|
version_added: 10.4.0
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
@ -72,6 +86,8 @@ groups:
|
||||||
kube_nodes: "'kube_node' in tags"
|
kube_nodes: "'kube_node' in tags"
|
||||||
compose:
|
compose:
|
||||||
ansible_port: 2222
|
ansible_port: 2222
|
||||||
|
use_vm_uuid: false
|
||||||
|
use_host_uuid: true
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
@ -196,10 +212,20 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
||||||
self._set_composite_vars(self.get_option('compose'), variables, name, strict=strict)
|
self._set_composite_vars(self.get_option('compose'), variables, name, strict=strict)
|
||||||
|
|
||||||
def _add_vms(self, vms, hosts, pools):
|
def _add_vms(self, vms, hosts, pools):
|
||||||
|
vm_name_list = []
|
||||||
for uuid, vm in vms.items():
|
for uuid, vm in vms.items():
|
||||||
|
if self.vm_entry_name_type == 'name_label':
|
||||||
|
if vm['name_label'] not in vm_name_list:
|
||||||
|
entry_name = vm['name_label']
|
||||||
|
vm_name_list.append(vm['name_label'])
|
||||||
|
else:
|
||||||
|
vm_duplicate_count = vm_name_list.count(vm['name_label'])
|
||||||
|
entry_name = vm['name_label'] + "_" + str(vm_duplicate_count)
|
||||||
|
vm_name_list.append(vm['name_label'])
|
||||||
|
else:
|
||||||
|
entry_name = uuid
|
||||||
group = 'with_ip'
|
group = 'with_ip'
|
||||||
ip = vm.get('mainIpAddress')
|
ip = vm.get('mainIpAddress')
|
||||||
entry_name = uuid
|
|
||||||
power_state = vm['power_state'].lower()
|
power_state = vm['power_state'].lower()
|
||||||
pool_name = self._pool_group_name_for_uuid(pools, vm['$poolId'])
|
pool_name = self._pool_group_name_for_uuid(pools, vm['$poolId'])
|
||||||
host_name = self._host_group_name_for_uuid(hosts, vm['$container'])
|
host_name = self._host_group_name_for_uuid(hosts, vm['$container'])
|
||||||
|
@ -246,8 +272,19 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
||||||
self._apply_constructable(entry_name, self.inventory.get_host(entry_name).get_vars())
|
self._apply_constructable(entry_name, self.inventory.get_host(entry_name).get_vars())
|
||||||
|
|
||||||
def _add_hosts(self, hosts, pools):
|
def _add_hosts(self, hosts, pools):
|
||||||
|
host_name_list = []
|
||||||
for host in hosts.values():
|
for host in hosts.values():
|
||||||
entry_name = host['uuid']
|
if self.host_entry_name_type == 'name_label':
|
||||||
|
if host['name_label'] not in host_name_list:
|
||||||
|
entry_name = host['name_label']
|
||||||
|
host_name_list.append(host['name_label'])
|
||||||
|
else:
|
||||||
|
host_duplicate_count = host_name_list.count(host['name_label'])
|
||||||
|
entry_name = host['name_label'] + "_" + str(host_duplicate_count)
|
||||||
|
host_name_list.append(host['name_label'])
|
||||||
|
else:
|
||||||
|
entry_name = host['uuid']
|
||||||
|
|
||||||
group_name = f"xo_host_{clean_group_name(host['name_label'])}"
|
group_name = f"xo_host_{clean_group_name(host['name_label'])}"
|
||||||
pool_name = self._pool_group_name_for_uuid(pools, host['$poolId'])
|
pool_name = self._pool_group_name_for_uuid(pools, host['$poolId'])
|
||||||
|
|
||||||
|
@ -337,5 +374,13 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
||||||
if not self.get_option('use_ssl'):
|
if not self.get_option('use_ssl'):
|
||||||
self.protocol = 'ws'
|
self.protocol = 'ws'
|
||||||
|
|
||||||
|
self.vm_entry_name_type = 'uuid'
|
||||||
|
if not self.get_option('use_vm_uuid'):
|
||||||
|
self.vm_entry_name_type = 'name_label'
|
||||||
|
|
||||||
|
self.host_entry_name_type = 'uuid'
|
||||||
|
if not self.get_option('use_host_uuid'):
|
||||||
|
self.host_entry_name_type = 'name_label'
|
||||||
|
|
||||||
objects = self._get_objects()
|
objects = self._get_objects()
|
||||||
self._populate(make_unsafe(objects))
|
self._populate(make_unsafe(objects))
|
||||||
|
|
|
@ -158,6 +158,8 @@ def test_verify_file_bad_config(inventory):
|
||||||
|
|
||||||
|
|
||||||
def test_populate(inventory, mocker):
|
def test_populate(inventory, mocker):
|
||||||
|
inventory.host_entry_name_type = 'uuid'
|
||||||
|
inventory.vm_entry_name_type = 'uuid'
|
||||||
inventory.get_option = mocker.MagicMock(side_effect=get_option)
|
inventory.get_option = mocker.MagicMock(side_effect=get_option)
|
||||||
inventory._populate(objects)
|
inventory._populate(objects)
|
||||||
actual = sorted(inventory.inventory.hosts.keys())
|
actual = sorted(inventory.inventory.hosts.keys())
|
||||||
|
|
Loading…
Reference in New Issue