]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
datamodel: schema and template for cache-clear command
authorAleš Mrázek <ales.mrazek@nic.cz>
Mon, 22 Jan 2024 20:36:46 +0000 (21:36 +0100)
committerAleš Mrázek <ales.mrazek@nic.cz>
Wed, 14 Feb 2024 12:14:30 +0000 (13:14 +0100)
manager/knot_resolver_manager/datamodel/cache_schema.py
manager/knot_resolver_manager/datamodel/templates/macros/cache_macros.lua.j2 [new file with mode: 0644]
manager/knot_resolver_manager/datamodel/templates/macros/common_macros.lua.j2
manager/tests/unit/datamodel/templates/test_cache_macros.py [new file with mode: 0644]

index 580a031d088e2c59e9c68f2e98d609aff1bf1dea..1c8a9fc38e86899ec7afafa72de9dd0e4ee353f8 100644 (file)
@@ -2,6 +2,7 @@ from typing import Any, List, Optional, Union
 
 from typing_extensions import Literal
 
+from knot_resolver_manager.datamodel.templates import template_from_str
 from knot_resolver_manager.datamodel.types import (
     Dir,
     DNSRecordTypeEnum,
@@ -17,6 +18,12 @@ from knot_resolver_manager.datamodel.types import (
 from knot_resolver_manager.utils.modeling import ConfigSchema
 from knot_resolver_manager.utils.modeling.base_schema import lazy_default
 
+_CACHE_CLEAR_TEMPLATE = template_from_str(
+    "{% from 'macros/common_macros.lua.j2' import tojson %}"
+    "{% from 'macros/cache_macros.lua.j2' import cache_clear %}"
+    "{{ tojson(cache_clear(params)) }}"
+)
+
 
 class CacheClearRPCSchema(ConfigSchema):
     name: Optional[DomainName] = None
@@ -24,6 +31,13 @@ class CacheClearRPCSchema(ConfigSchema):
     rr_type: Optional[DNSRecordTypeEnum] = None
     chunk_size: IntPositive = IntPositive(100)
 
+    def _validate(self) -> None:
+        if self.rr_type and not self.exact_name:
+            raise ValueError("'rr-type' is only supported with 'exact-name: true'")
+
+    def render_lua(self) -> str:
+        return _CACHE_CLEAR_TEMPLATE.render(params=self)  # pyright: reportUnknownMemberType=false
+
 
 class PrefillSchema(ConfigSchema):
     """
diff --git a/manager/knot_resolver_manager/datamodel/templates/macros/cache_macros.lua.j2 b/manager/knot_resolver_manager/datamodel/templates/macros/cache_macros.lua.j2
new file mode 100644 (file)
index 0000000..51df48d
--- /dev/null
@@ -0,0 +1,11 @@
+{% from 'macros/common_macros.lua.j2' import boolean, quotes, qtype_table %}
+
+
+{% macro cache_clear(params) -%}
+cache.clear(
+{{- quotes(params.name) if params.name else 'nil' -}},
+{{- boolean(params.exact_name) -}},
+{{- qtype_table(params.rr_type) if params.rr_type else 'nil' -}},
+{{- params.chunk_size if not params.exact_name else 'nil' -}}
+)
+{%- endmacro %}
index 4c2ba11a8e55c90d37c47a44f53e864a8cb10697..4d1bcc78bebe8382062cadc2b1ebff580b2d3f72 100644 (file)
@@ -1,3 +1,7 @@
+{% macro tojson(object) -%}
+tojson({{ object }})
+{%- endmacro %}
+
 {% macro quotes(string) -%}
 '{{ string }}'
 {%- endmacro %}
diff --git a/manager/tests/unit/datamodel/templates/test_cache_macros.py b/manager/tests/unit/datamodel/templates/test_cache_macros.py
new file mode 100644 (file)
index 0000000..155905c
--- /dev/null
@@ -0,0 +1,25 @@
+from typing import Any
+
+import pytest
+
+from knot_resolver_manager.datamodel.cache_schema import CacheClearRPCSchema
+from knot_resolver_manager.datamodel.templates import template_from_str
+
+
+@pytest.mark.parametrize(
+    "val,res",
+    [
+        ({}, "cache.clear(nil,false,nil,100)"),
+        ({"chunk-size": 200}, "cache.clear(nil,false,nil,200)"),
+        ({"name": "example.com.", "exact-name": True}, "cache.clear('example.com.',true,nil,nil)"),
+        (
+            {"name": "example.com.", "exact-name": True, "rr-type": "AAAA"},
+            "cache.clear('example.com.',true,kres.type.AAAA,nil)",
+        ),
+    ],
+)
+def test_cache_clear(val: Any, res: Any):
+    tmpl_str = "{% from 'macros/cache_macros.lua.j2' import cache_clear %}{{ cache_clear(x) }}"
+
+    tmpl = template_from_str(tmpl_str)
+    assert tmpl.render(x=CacheClearRPCSchema(val)) == res