diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3d1ff57..51138c0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: strategy: fail-fast: false matrix: - netbox_version: &nb_versions [v4.4.10, v4.5.8, v4.6.0] + netbox_version: &nb_versions [v4.4.10, v4.5.8, v4.6.3] steps: - name: Checkout uses: actions/checkout@v3 diff --git a/validity/models/device.py b/validity/models/device.py index 5250b3b..498473f 100644 --- a/validity/models/device.py +++ b/validity/models/device.py @@ -65,7 +65,7 @@ def dynamic_pair(self) -> Optional["VDevice"]: filter_ = self.selector.dynamic_pair_filter(self) if filter_ is None: return - pair = type(self).objects.filter(filter_).first() + pair = type(self).objects.filter(filter_).prefetch_serializer().first() if pair: pair.data_source = self.data_source pair.poller = self.poller diff --git a/validity/tests/test_scripts/runtests/test_apply.py b/validity/tests/test_scripts/runtests/test_apply.py index 3d66696..e6b8800 100644 --- a/validity/tests/test_scripts/runtests/test_apply.py +++ b/validity/tests/test_scripts/runtests/test_apply.py @@ -2,7 +2,16 @@ from unittest.mock import Mock import pytest -from factories import CompTestDBFactory, CompTestResultFactory, DeviceFactory, NameSetDBFactory, SelectorFactory +from factories import ( + CompTestDBFactory, + CompTestResultFactory, + DataFileFactory, + DataSourceFactory, + DeviceFactory, + NameSetDBFactory, + SelectorFactory, + SerializerDBFactory, +) from validity.compliance.eval.eval_defaults import DEFAULT_NAMESET from validity.compliance.exceptions import EvalError @@ -111,6 +120,34 @@ def test_run_tests_for_device(): assert executor.results_count == 3 +@pytest.mark.django_db +def test_run_tests_for_device_with_dynamic_pair_config(create_custom_fields): + data_source = DataSourceFactory( + custom_field_data={"default": True, "device_config_path": "configs/{{ device.name }}.yaml"} + ) + serializer = SerializerDBFactory(extraction_method="YAML", template="") + device = DeviceFactory(name="leaf01-a", custom_field_data={"serializer": serializer.pk}) + dynamic_pair = DeviceFactory(name="leaf01-b", custom_field_data={"serializer": serializer.pk}) + DataFileFactory(source=data_source, path="configs/leaf01-a.yaml", data=b"interfaces: {}\n") + DataFileFactory( + source=data_source, + path="configs/leaf01-b.yaml", + data=b"interfaces:\n ae10:\n description: peer-link\n", + ) + selector = SelectorFactory(name_filter=r"leaf01-([ab])", dynamic_pairs="NAME") + test = CompTestDBFactory(expression="device.dynamic_pair.config['interfaces']['ae10']") + test.selectors.set([selector]) + device_qs, test_qs = next(DeviceTestIterator({selector.pk: [device.pk]}, [], None)) + executor = TExecutor(Logger(), explanation_verbosity=2, report_id=30) + + [result] = list(executor(device_qs, test_qs)) + + assert result.passed is True + assert result.dynamic_pair == dynamic_pair + assert executor.results_passed == 1 + assert executor.results_count == 1 + + @pytest.mark.django_db def test_devicetest_iterator(): devices = [DeviceFactory() for _ in range(3)]