Skip to content

Commit e628b1e

Browse files
authored
fix config unavailability for a dynamic pair (#200)
* fix config unavailability for a dynamic pair * bump CI netbox to 4.6.3
1 parent e8f829e commit e628b1e

3 files changed

Lines changed: 40 additions & 3 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
strategy:
2424
fail-fast: false
2525
matrix:
26-
netbox_version: &nb_versions [v4.4.10, v4.5.8, v4.6.0]
26+
netbox_version: &nb_versions [v4.4.10, v4.5.8, v4.6.3]
2727
steps:
2828
- name: Checkout
2929
uses: actions/checkout@v3

validity/models/device.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def dynamic_pair(self) -> Optional["VDevice"]:
6565
filter_ = self.selector.dynamic_pair_filter(self)
6666
if filter_ is None:
6767
return
68-
pair = type(self).objects.filter(filter_).first()
68+
pair = type(self).objects.filter(filter_).prefetch_serializer().first()
6969
if pair:
7070
pair.data_source = self.data_source
7171
pair.poller = self.poller

validity/tests/test_scripts/runtests/test_apply.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,16 @@
22
from unittest.mock import Mock
33

44
import pytest
5-
from factories import CompTestDBFactory, CompTestResultFactory, DeviceFactory, NameSetDBFactory, SelectorFactory
5+
from factories import (
6+
CompTestDBFactory,
7+
CompTestResultFactory,
8+
DataFileFactory,
9+
DataSourceFactory,
10+
DeviceFactory,
11+
NameSetDBFactory,
12+
SelectorFactory,
13+
SerializerDBFactory,
14+
)
615

716
from validity.compliance.eval.eval_defaults import DEFAULT_NAMESET
817
from validity.compliance.exceptions import EvalError
@@ -111,6 +120,34 @@ def test_run_tests_for_device():
111120
assert executor.results_count == 3
112121

113122

123+
@pytest.mark.django_db
124+
def test_run_tests_for_device_with_dynamic_pair_config(create_custom_fields):
125+
data_source = DataSourceFactory(
126+
custom_field_data={"default": True, "device_config_path": "configs/{{ device.name }}.yaml"}
127+
)
128+
serializer = SerializerDBFactory(extraction_method="YAML", template="")
129+
device = DeviceFactory(name="leaf01-a", custom_field_data={"serializer": serializer.pk})
130+
dynamic_pair = DeviceFactory(name="leaf01-b", custom_field_data={"serializer": serializer.pk})
131+
DataFileFactory(source=data_source, path="configs/leaf01-a.yaml", data=b"interfaces: {}\n")
132+
DataFileFactory(
133+
source=data_source,
134+
path="configs/leaf01-b.yaml",
135+
data=b"interfaces:\n ae10:\n description: peer-link\n",
136+
)
137+
selector = SelectorFactory(name_filter=r"leaf01-([ab])", dynamic_pairs="NAME")
138+
test = CompTestDBFactory(expression="device.dynamic_pair.config['interfaces']['ae10']")
139+
test.selectors.set([selector])
140+
device_qs, test_qs = next(DeviceTestIterator({selector.pk: [device.pk]}, [], None))
141+
executor = TExecutor(Logger(), explanation_verbosity=2, report_id=30)
142+
143+
[result] = list(executor(device_qs, test_qs))
144+
145+
assert result.passed is True
146+
assert result.dynamic_pair == dynamic_pair
147+
assert executor.results_passed == 1
148+
assert executor.results_count == 1
149+
150+
114151
@pytest.mark.django_db
115152
def test_devicetest_iterator():
116153
devices = [DeviceFactory() for _ in range(3)]

0 commit comments

Comments
 (0)