From 8e9ec610c3749d543befc299e7c58ff782640bd1 Mon Sep 17 00:00:00 2001 From: Julien Riou Date: Sun, 21 Aug 2022 12:10:31 +0200 Subject: [PATCH] feat: Add crc32 filter (#5062) * feat: Add crc32 filter Compute CRC32 checksum of a string and return its hex representation. Can be use to create short checksums. Signed-off-by: Julien Riou * Update license lines * Improve string check of a crc32 value Signed-off-by: Julien Riou Signed-off-by: Julien Riou Co-authored-by: Felix Fontein --- .github/BOTMETA.yml | 2 + plugins/filter/crc32.py | 64 +++++++++++++++++++++++++ tests/unit/plugins/filter/test_crc32.py | 17 +++++++ 3 files changed, 83 insertions(+) create mode 100644 plugins/filter/crc32.py create mode 100644 tests/unit/plugins/filter/test_crc32.py diff --git a/.github/BOTMETA.yml b/.github/BOTMETA.yml index aff10b2255..5ae2935209 100644 --- a/.github/BOTMETA.yml +++ b/.github/BOTMETA.yml @@ -125,6 +125,8 @@ files: labels: xenserver $filters/counter.py: maintainers: keilr + $filters/crc32.py: + maintainers: jouir $filters/dict.py: maintainers: felixfontein $filters/dict_kv.py: diff --git a/plugins/filter/crc32.py b/plugins/filter/crc32.py new file mode 100644 index 0000000000..1f0aa2e9b0 --- /dev/null +++ b/plugins/filter/crc32.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2022, Julien Riou +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible.errors import AnsibleFilterError +from ansible.module_utils.common.text.converters import to_bytes +from ansible.module_utils.common.collections import is_string + +try: + from zlib import crc32 + HAS_ZLIB = True +except ImportError: + HAS_ZLIB = False + + +DOCUMENTATION = ''' + name: crc32 + short_description: Generate a CRC32 checksum + version_added: 5.4.0 + description: + - Checksum a string using CRC32 algorithm and return its hexadecimal representation. + options: + _input: + description: + - The string to checksum. + type: string + required: true + author: + - Julien Riou +''' + +EXAMPLES = ''' + - name: Checksum a test string + ansible.builtin.debug: + msg: "{{ 'test' | community.general.crc32 }}" +''' + +RETURN = ''' + _value: + description: CRC32 checksum. + type: string +''' + + +def crc32s(value): + if not is_string(value): + raise AnsibleFilterError('Invalid value type (%s) for crc32 (%r)' % + (type(value), value)) + + if not HAS_ZLIB: + raise AnsibleFilterError('Failed to import zlib module') + + data = to_bytes(value, errors='surrogate_or_strict') + return "{0:x}".format(crc32(data) & 0xffffffff) + + +class FilterModule: + def filters(self): + return { + 'crc32': crc32s, + } diff --git a/tests/unit/plugins/filter/test_crc32.py b/tests/unit/plugins/filter/test_crc32.py new file mode 100644 index 0000000000..961840235d --- /dev/null +++ b/tests/unit/plugins/filter/test_crc32.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2022, Julien Riou +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible_collections.community.general.tests.unit.compat import unittest +from ansible.errors import AnsibleError +from ansible_collections.community.general.plugins.filter.crc32 import crc32s + + +class TestFilterCrc32(unittest.TestCase): + + def test_checksum(self): + self.assertEqual(crc32s('test'), 'd87f7e0c')