Skip to content

Commit

Permalink
[PR #5714/2d4ce9f2 backport][stable-6] feat: add tags to proxmox cont…
Browse files Browse the repository at this point in the history
…ainers (#5745)

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 <[email protected]>

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

* fix: actually check unsupported feature presence before failing

Co-authored-by: Felix Fontein <[email protected]>
(cherry picked from commit 2d4ce9f)

Co-authored-by: GuillaumeV-cemea <[email protected]>
  • Loading branch information
patchback[bot] and GuillaumeV-cemea authored Dec 30, 2022
1 parent 2ab26db commit 50b9855
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 1 deletion.
3 changes: 3 additions & 0 deletions changelogs/fragments/5714-proxmox-lxc-tag-support.yml
Original file line number Diff line number Diff line change
@@ -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).
35 changes: 34 additions & 1 deletion plugins/modules/proxmox.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,14 @@
description:
- sets DNS search domain for a container
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:
description:
- timeout for operations
Expand Down Expand Up @@ -391,6 +399,7 @@
state: absent
'''

import re
import time

from ansible_collections.community.general.plugins.module_utils.version import LooseVersion
Expand All @@ -415,11 +424,25 @@ def is_template_container(self, node, vmid):
return config['template']

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)

# Remove all empty kwarg entries
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':
kwargs['cpulimit'] = cpus
kwargs['rootfs'] = disk
Expand All @@ -437,6 +460,14 @@ def create_instance(self, vmid, node, disk, storage, cpus, memory, swap, timeout
kwargs['cpus'] = cpus
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 VZ_TYPE != 'lxc':
self.module.fail_json(changed=False, msg="Clone operator is only supported for LXC enabled proxmox clusters.")
Expand Down Expand Up @@ -569,6 +600,7 @@ def main():
proxmox_default_behavior=dict(type='str', default='no_defaults', choices=['compatibility', 'no_defaults']),
clone=dict(type='int'),
clone_type=dict(default='opportunistic', choices=['full', 'linked', 'opportunistic']),
tags=dict(type='list', elements='str')
)
module_args.update(proxmox_args)

Expand Down Expand Up @@ -674,7 +706,8 @@ def main():
features=",".join(module.params['features']) if module.params['features'] is not None else None,
unprivileged=ansible_to_proxmox_bool(module.params['unprivileged']),
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']))
except Exception as e:
Expand Down

0 comments on commit 50b9855

Please sign in to comment.