Merge pull request #419 from rjeffman/util_check_api_version

Add FreeIPA version check to module_utils.ansible_freeipa_module.
This commit is contained in:
Thomas Woerner
2020-11-16 17:01:33 +01:00
committed by GitHub
4 changed files with 82 additions and 13 deletions

View File

@@ -141,7 +141,7 @@ Variable | Description | Required
`name` \| `cn` | The permission name string. | yes `name` \| `cn` | The permission name string. | yes
`right` \| `ipapermright` | Rights to grant. It can be a list of one or more of `read`, `search`, `compare`, `write`, `add`, `delete`, and `all` default: `all` | no `right` \| `ipapermright` | Rights to grant. It can be a list of one or more of `read`, `search`, `compare`, `write`, `add`, `delete`, and `all` default: `all` | no
`attrs` | All attributes to which the permission applies | no `attrs` | All attributes to which the permission applies | no
`bindtype` \| `ipapermbindruletype` | Bind rule type. It can be one of `permission`, `all`, `self`, or `anonymous` defaults to `permission` for new permissions.| no `bindtype` \| `ipapermbindruletype` | Bind rule type. It can be one of `permission`, `all`, `self`, or `anonymous` defaults to `permission` for new permissions. Bind rule type `self` can only be used on IPA versions 4.8.7 or up.| no
`subtree` \| `ipapermlocation` | Subtree to apply permissions to | no `subtree` \| `ipapermlocation` | Subtree to apply permissions to | no
`filter` \| `extratargetfilter` | Extra target filter | no `filter` \| `extratargetfilter` | Extra target filter | no
`rawfilter` \| `ipapermtargetfilter` | All target filters | no `rawfilter` \| `ipapermtargetfilter` | All target filters | no

View File

@@ -23,6 +23,7 @@
import sys import sys
import operator
import os import os
import uuid import uuid
import tempfile import tempfile
@@ -30,6 +31,25 @@ import shutil
import gssapi import gssapi
from datetime import datetime from datetime import datetime
from pprint import pformat from pprint import pformat
try:
from packaging import version
except ImportError:
# If `packaging` not found, split version string for creating version
# object. Although it is not PEP 440 compliant, it will work for stable
# FreeIPA releases.
import re
class version:
@staticmethod
def parse(version_str):
"""
Split a version string A.B.C, into a tuple.
This will not work for `rc`, `dev` or similar version string.
"""
return tuple(re.split("[-_\.]", version_str)) # noqa: W605
from ipalib import api from ipalib import api
from ipalib import errors as ipalib_errors # noqa from ipalib import errors as ipalib_errors # noqa
from ipalib.config import Env from ipalib.config import Env
@@ -41,6 +61,7 @@ except ImportError:
from ipapython.ipautil import kinit_password, kinit_keytab from ipapython.ipautil import kinit_password, kinit_keytab
from ipapython.ipautil import run from ipapython.ipautil import run
from ipapython.dn import DN from ipapython.dn import DN
from ipapython.version import VERSION
from ipaplatform.paths import paths from ipaplatform.paths import paths
from ipalib.krb_utils import get_credentials_if_valid from ipalib.krb_utils import get_credentials_if_valid
from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.basic import AnsibleModule
@@ -187,6 +208,26 @@ def api_check_param(command, name):
return name in api.Command[command].params return name in api.Command[command].params
def api_check_ipa_version(oper, requested_version):
"""
Compare the installed IPA version against a requested version.
The valid operators are: <, <=, >, >=, ==, !=
"""
oper_map = {
"<": operator.lt,
"<=": operator.le,
">": operator.gt,
">=": operator.ge,
"==": operator.eq,
"!=": operator.ne,
}
operation = oper_map.get(oper)
if not(operation):
raise NotImplementedError("Invalid operator: %s" % oper)
return operation(version.parse(VERSION), version.parse(requested_version))
def execute_api_command(module, principal, password, command, name, args): def execute_api_command(module, principal, password, command, name, args):
""" """
Execute an API command. Execute an API command.

View File

@@ -152,7 +152,8 @@ RETURN = """
from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.ansible_freeipa_module import \ from ansible.module_utils.ansible_freeipa_module import \
temp_kinit, temp_kdestroy, valid_creds, api_connect, api_command, \ temp_kinit, temp_kdestroy, valid_creds, api_connect, api_command, \
compare_args_ipa, module_params_get, gen_add_del_lists compare_args_ipa, module_params_get, gen_add_del_lists, \
api_check_ipa_version
import six import six
if six.PY3: if six.PY3:
@@ -336,6 +337,10 @@ def main():
msg="Argument '%s' can not be used with action " msg="Argument '%s' can not be used with action "
"'%s' and state '%s'" % (x, action, state)) "'%s' and state '%s'" % (x, action, state))
if bindtype == "self" and api_check_ipa_version("<", "4.8.7"):
ansible_module.fail_json(
msg="Bindtype 'self' is not supported by your IPA version.")
# Init # Init
changed = False changed = False

View File

@@ -4,15 +4,19 @@
become: true become: true
tasks: tasks:
- include_tasks: ../env_freeipa_facts.yml
# CLEANUP TEST ITEMS # CLEANUP TEST ITEMS
- name: Ensure permission perm-test-1 is absent - name: Ensure permission perm-test-1 is absent
ipapermission: ipapermission:
ipaadmin_password: SomeADMINpassword ipaadmin_password: SomeADMINpassword
name: perm-test-1 name:
- perm-test-1
- perm-test-bindtype-test
- perm-test-renamed
state: absent state: absent
# TESTS # TESTS
- name: Ensure permission perm-test-1 is present - name: Ensure permission perm-test-1 is present
@@ -38,7 +42,7 @@
ipaadmin_password: SomeADMINpassword ipaadmin_password: SomeADMINpassword
name: perm-test-1 name: perm-test-1
privilege: "User Administrators" privilege: "User Administrators"
action: member action: member
register: result register: result
failed_when: not result.changed or result.failed failed_when: not result.changed or result.failed
@@ -89,7 +93,7 @@
state: absent state: absent
register: result register: result
failed_when: result.changed or result.failed failed_when: result.changed or result.failed
- name: Ensure permission perm-test-renamed is present - name: Ensure permission perm-test-renamed is present
ipapermission: ipapermission:
ipaadmin_password: SomeADMINpassword ipaadmin_password: SomeADMINpassword
@@ -99,16 +103,35 @@
register: result register: result
failed_when: result.changed or result.failed failed_when: result.changed or result.failed
- name: Ensure permission with bindtype 'self' is present, if IPA version >= 4.8.7
ipapermission:
ipaadmin_password: SomeADMINpassword
name: perm-test-bindtype-test
bindtype: self
object_type: host
right: all
when: ipa_version is version('4.8.7', '>=')
register: result
failed_when: not result.changed or result.failed
- name: Fail to set permission perm-test-renamed bindtype to 'self', if IPA version < 4.8.7
ipapermission:
ipaadmin_password: SomeADMINpassword
name: perm-test-bindtype-test
bindtype: self
object_type: host
right: all
when: ipa_version is version('4.8.7', '<')
register: result
failed_when: not result.failed or "Bindtype 'self' is not supported by your IPA version." not in result.msg
# CLEANUP TEST ITEMS # CLEANUP TEST ITEMS
- name: Ensure permission perm-test-1 is absent - name: Ensure permission perm-test-1 is absent
ipapermission: ipapermission:
ipaadmin_password: SomeADMINpassword ipaadmin_password: SomeADMINpassword
name: perm-test-1 name:
state: absent - perm-test-1
- perm-test-bindtype-test
- name: Ensure permission perm-test-renamed is absent - perm-test-renamed
ipapermission:
ipaadmin_password: SomeADMINpassword
name: perm-test-renamed
state: absent state: absent