Skip to content

Commit

Permalink
add filter support for one_template module
Browse files Browse the repository at this point in the history
apply suggestion from code review
add one_template filter changelog fragment
rewrote filter flag to use string instead of int
renamed flag to option in changelog

Co-authored-by: Felix Fontein <[email protected]>
Co-authored-by: Alexei Znamensky <[email protected]>
  • Loading branch information
3 people committed Jan 9, 2025
1 parent 3af793c commit 64642d7
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 17 deletions.
2 changes: 2 additions & 0 deletions changelogs/fragments/9547-one_template-filter.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
minor_changes:
- one_template - adds ``filter`` option for retrieving templates which are not owned by the user (https://github.com/ansible-collections/community.general/issues/9278).
49 changes: 32 additions & 17 deletions plugins/modules/one_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,16 @@
choices: ["present", "absent"]
default: present
type: str
filter:
description:
- V(user_primary_group) - Resources belonging to the user's primary group.
- V(user) - Resources belonging to the user.
- V(all) - All resources.
- V(user_groups) - Resources belonging to the user and any of his groups.
choices: [user_primary_group, user, all, user_groups]
default: user
type: str
version_added: 10.3.0
extends_documentation_fragment:
- community.general.opennebula
Expand Down Expand Up @@ -156,6 +166,7 @@ def __init__(self):
name=dict(type='str', required=False),
state=dict(type='str', choices=['present', 'absent'], default='present'),
template=dict(type='str', required=False),
filter=dict(type='str', required=False, choices=['user_primary_group', 'user', 'all', 'user_groups'], default='user'),
)

mutually_exclusive = [
Expand All @@ -181,10 +192,11 @@ def run(self, one, module, result):
name = params.get('name')
desired_state = params.get('state')
template_data = params.get('template')
filter = params.get('filter')

self.result = {}

template = self.get_template_instance(id, name)
template = self.get_template_instance(id, name, filter)
needs_creation = False
if not template and desired_state != 'absent':
if id:
Expand All @@ -196,34 +208,37 @@ def run(self, one, module, result):
self.result = self.delete_template(template)
else:
if needs_creation:
self.result = self.create_template(name, template_data)
self.result = self.create_template(name, template_data, filter)
else:
self.result = self.update_template(template, template_data)
self.result = self.update_template(template, template_data, filter)

self.exit()

def get_template(self, predicate):
# -3 means "Resources belonging to the user"
def get_template(self, predicate, filter):
# filter was included, for discussions see:
# Issue: https://github.com/ansible-collections/community.general/issues/9278
# PR: https://github.com/ansible-collections/community.general/pull/9547
# the other two parameters are used for pagination, -1 for both essentially means "return all"
pool = self.one.templatepool.info(-3, -1, -1)
filter_values = {'user_primary_group': -4, 'user': -3, 'all': -2, 'user_groups': -1}
pool = self.one.templatepool.info(filter_values[filter], -1, -1)

for template in pool.VMTEMPLATE:
if predicate(template):
return template

return None

def get_template_by_id(self, template_id):
return self.get_template(lambda template: (template.ID == template_id))
def get_template_by_id(self, template_id, filter):
return self.get_template(lambda template: (template.ID == template_id), filter)

def get_template_by_name(self, name):
return self.get_template(lambda template: (template.NAME == name))
def get_template_by_name(self, name, filter):
return self.get_template(lambda template: (template.NAME == name), filter)

def get_template_instance(self, requested_id, requested_name):
def get_template_instance(self, requested_id, requested_name, filter):
if requested_id:
return self.get_template_by_id(requested_id)
return self.get_template_by_id(requested_id, filter)
else:
return self.get_template_by_name(requested_name)
return self.get_template_by_name(requested_name, filter)

def get_template_info(self, template):
info = {
Expand All @@ -238,21 +253,21 @@ def get_template_info(self, template):

return info

def create_template(self, name, template_data):
def create_template(self, name, template_data, filter):
if not self.module.check_mode:
self.one.template.allocate("NAME = \"" + name + "\"\n" + template_data)

result = self.get_template_info(self.get_template_by_name(name))
result = self.get_template_info(self.get_template_by_name(name, filter))
result['changed'] = True

return result

def update_template(self, template, template_data):
def update_template(self, template, template_data, filter):
if not self.module.check_mode:
# 0 = replace the whole template
self.one.template.update(template.ID, template_data, 0)

result = self.get_template_info(self.get_template_by_id(template.ID))
result = self.get_template_info(self.get_template_by_id(template.ID, filter))
if self.module.check_mode:
# Unfortunately it is not easy to detect if the template would have changed, therefore always report a change here.
result['changed'] = True
Expand Down

0 comments on commit 64642d7

Please sign in to comment.