Added get_cymais_path (Rename it later)

This commit is contained in:
Kevin Veen-Birkenbach 2025-07-15 11:58:21 +02:00
parent fff06d52b8
commit e90c9a18b0
No known key found for this signature in database
GPG Key ID: 44D8F11FD62F878E
2 changed files with 96 additions and 0 deletions

View File

@ -0,0 +1,50 @@
# filter_plugins/get_cymais_path.py
"""
This plugin provides filters to extract the CyMaIS directory and file identifiers
from a given role name. It assumes the role name is structured as 'dir_file'.
If the structure is invalid (e.g., missing or too many underscores), it raises an error.
These filters are used to support internal processing within CyMaIS.
"""
from ansible.errors import AnsibleFilterError
class CymaisPathExtractor:
"""Extracts directory and file parts from role names in the format 'dir_file'."""
def __init__(self, value):
self.value = value
self._parts = self._split_value()
def _split_value(self):
parts = self.value.split("_")
if len(parts) != 2:
raise AnsibleFilterError(
f"Invalid format: '{self.value}' must contain exactly one underscore (_)"
)
return parts
def get_dir(self):
return self._parts[0]
def get_file(self):
return self._parts[1]
def get_cymais_dir(value):
return CymaisPathExtractor(value).get_dir()
def get_cymais_file(value):
return CymaisPathExtractor(value).get_file()
class FilterModule(object):
"""Ansible filter plugin for CyMaIS path parsing."""
def filters(self):
return {
"get_cymais_dir": get_cymais_dir,
"get_cymais_file": get_cymais_file,
}

View File

@ -0,0 +1,46 @@
# tests/unit/filter_plugins/test_get_cymais_path.py
import unittest
import sys
import os
# Ensure the filter_plugins directory is in the import path
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../filter_plugins')))
from get_cymais_path import get_cymais_dir, get_cymais_file
from ansible.errors import AnsibleFilterError
class TestGetCymaisPath(unittest.TestCase):
def test_valid_input(self):
"""Test valid input with exactly one underscore"""
self.assertEqual(get_cymais_dir("web_app"), "web")
self.assertEqual(get_cymais_file("web_app"), "app")
self.assertEqual(get_cymais_dir("sys_timer"), "sys")
self.assertEqual(get_cymais_file("sys_timer"), "timer")
def test_invalid_no_underscore(self):
"""Test input with no underscore raises error"""
with self.assertRaises(AnsibleFilterError):
get_cymais_dir("invalid")
with self.assertRaises(AnsibleFilterError):
get_cymais_file("invalid")
def test_invalid_multiple_underscores(self):
"""Test input with more than one underscore raises error"""
with self.assertRaises(AnsibleFilterError):
get_cymais_dir("too_many_parts_here")
with self.assertRaises(AnsibleFilterError):
get_cymais_file("too_many_parts_here")
def test_empty_string(self):
"""Test empty string input raises error"""
with self.assertRaises(AnsibleFilterError):
get_cymais_dir("")
with self.assertRaises(AnsibleFilterError):
get_cymais_file("")
if __name__ == '__main__':
unittest.main()