From: Aleš Mrázek Date: Mon, 22 Jan 2024 20:36:46 +0000 (+0100) Subject: datamodel: schema and template for cache-clear command X-Git-Tag: v6.0.7~23^2~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a78e883182b264bf59a86a8c955b3547fcd01d89;p=thirdparty%2Fknot-resolver.git datamodel: schema and template for cache-clear command --- diff --git a/manager/knot_resolver_manager/datamodel/cache_schema.py b/manager/knot_resolver_manager/datamodel/cache_schema.py index 580a031d0..1c8a9fc38 100644 --- a/manager/knot_resolver_manager/datamodel/cache_schema.py +++ b/manager/knot_resolver_manager/datamodel/cache_schema.py @@ -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 index 000000000..51df48da1 --- /dev/null +++ b/manager/knot_resolver_manager/datamodel/templates/macros/cache_macros.lua.j2 @@ -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 %} diff --git a/manager/knot_resolver_manager/datamodel/templates/macros/common_macros.lua.j2 b/manager/knot_resolver_manager/datamodel/templates/macros/common_macros.lua.j2 index 4c2ba11a8..4d1bcc78b 100644 --- a/manager/knot_resolver_manager/datamodel/templates/macros/common_macros.lua.j2 +++ b/manager/knot_resolver_manager/datamodel/templates/macros/common_macros.lua.j2 @@ -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 index 000000000..155905c66 --- /dev/null +++ b/manager/tests/unit/datamodel/templates/test_cache_macros.py @@ -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