1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

feat: add tags to proxmox containers (#5714)

* feat: add tags to proxmox containers

* fix: correct version added

* fix: code style

* feat: changelog fragment

* fix: correct version_added

Co-authored-by: Felix Fontein <felix@fontein.de>

* feat: fail on unsupported params, rather than silently ignoring them

* fix: actually check unsupported feature presence before failing

Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
GuillaumeV-cemea 2022-12-30 22:09:00 +01:00 committed by GitHub
parent 669d0925f7
commit 2d4ce9f219
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 1 deletions

View file

@ -0,0 +1,3 @@
---
minor_changes:
- proxmox - added new module parameter ``tags`` for use with PVE 7+ (https://github.com/ansible-collections/community.general/pull/5714).

View file

@ -106,6 +106,14 @@ options:
description: description:
- sets DNS search domain for a container - sets DNS search domain for a container
type: str type: str
tags:
description:
- List of tags to apply to the container.
- Tags must start with C([a-z0-9_]) followed by zero or more of the following characters C([a-z0-9_-+.]).
- Tags are only available in Proxmox 7+.
type: list
elements: str
version_added: 6.2.0
timeout: timeout:
description: description:
- timeout for operations - timeout for operations
@ -391,6 +399,7 @@ EXAMPLES = r'''
state: absent state: absent
''' '''
import re
import time import time
from ansible_collections.community.general.plugins.module_utils.version import LooseVersion from ansible_collections.community.general.plugins.module_utils.version import LooseVersion
@ -415,11 +424,25 @@ class ProxmoxLxcAnsible(ProxmoxAnsible):
return config['template'] return config['template']
def create_instance(self, vmid, node, disk, storage, cpus, memory, swap, timeout, clone, **kwargs): def create_instance(self, vmid, node, disk, storage, cpus, memory, swap, timeout, clone, **kwargs):
# Version limited features
minimum_version = {
'tags': 7,
}
proxmox_node = self.proxmox_api.nodes(node) proxmox_node = self.proxmox_api.nodes(node)
# Remove all empty kwarg entries # Remove all empty kwarg entries
kwargs = dict((k, v) for k, v in kwargs.items() if v is not None) kwargs = dict((k, v) for k, v in kwargs.items() if v is not None)
version = self.version()
pve_major_version = 3 if version < LooseVersion('4.0') else version.version[0]
# Fail on unsupported features
for option, version in minimum_version.items():
if pve_major_version < version and option in kwargs:
self.module.fail_json(changed=False, msg="Feature {option} is only supported in PVE {version}+, and you're using PVE {pve_major_version}".
format(option=option, version=version, pve_major_version=pve_major_version))
if VZ_TYPE == 'lxc': if VZ_TYPE == 'lxc':
kwargs['cpulimit'] = cpus kwargs['cpulimit'] = cpus
kwargs['rootfs'] = disk kwargs['rootfs'] = disk
@ -437,6 +460,14 @@ class ProxmoxLxcAnsible(ProxmoxAnsible):
kwargs['cpus'] = cpus kwargs['cpus'] = cpus
kwargs['disk'] = disk kwargs['disk'] = disk
# LXC tags are expected to be valid and presented as a comma/semi-colon delimited string
if 'tags' in kwargs:
re_tag = re.compile(r'^[a-z0-9_][a-z0-9_\-\+\.]*$')
for tag in kwargs['tags']:
if not re_tag.match(tag):
self.module.fail_json(msg='%s is not a valid tag' % tag)
kwargs['tags'] = ",".join(kwargs['tags'])
if clone is not None: if clone is not None:
if VZ_TYPE != 'lxc': if VZ_TYPE != 'lxc':
self.module.fail_json(changed=False, msg="Clone operator is only supported for LXC enabled proxmox clusters.") self.module.fail_json(changed=False, msg="Clone operator is only supported for LXC enabled proxmox clusters.")
@ -569,6 +600,7 @@ def main():
proxmox_default_behavior=dict(type='str', default='no_defaults', choices=['compatibility', 'no_defaults']), proxmox_default_behavior=dict(type='str', default='no_defaults', choices=['compatibility', 'no_defaults']),
clone=dict(type='int'), clone=dict(type='int'),
clone_type=dict(default='opportunistic', choices=['full', 'linked', 'opportunistic']), clone_type=dict(default='opportunistic', choices=['full', 'linked', 'opportunistic']),
tags=dict(type='list', elements='str')
) )
module_args.update(proxmox_args) module_args.update(proxmox_args)
@ -674,7 +706,8 @@ def main():
features=",".join(module.params['features']) if module.params['features'] is not None else None, features=",".join(module.params['features']) if module.params['features'] is not None else None,
unprivileged=ansible_to_proxmox_bool(module.params['unprivileged']), unprivileged=ansible_to_proxmox_bool(module.params['unprivileged']),
description=module.params['description'], description=module.params['description'],
hookscript=module.params['hookscript']) hookscript=module.params['hookscript'],
tags=module.params['tags'])
module.exit_json(changed=True, msg="Deployed VM %s from template %s" % (vmid, module.params['ostemplate'])) module.exit_json(changed=True, msg="Deployed VM %s from template %s" % (vmid, module.params['ostemplate']))
except Exception as e: except Exception as e: