Files
sven b1c9c7a40b modified: netbox_services/engine/__init__.py
modified:   netbox_services/engine/allocators.py
modified:   netbox_services/engine/context.py
new file:   netbox_services/engine/mappers.py
modified:   netbox_services/engine/resolver.py
new file:   netbox_services/engine/templating.py
modified:   netbox_services/forms.py
modified:   netbox_services/models.py
modified:   netbox_services/tests/test_allocators.py
new file:   netbox_services/tests/test_mappers.py
modified:   netbox_services/tests/test_resolver.py
new file:   netbox_services/tests/test_templating.py
Simplify layout to template and service instances
2026-08-17 15:12:42 +02:00

114 lines
4.4 KiB
Python

import pytest
from netbox_services.engine.allocators import (
CreateAllocator,
FirstFreeIPAddressAllocator,
SpecificAllocator,
)
@pytest.mark.django_db
class TestFirstFreeIPAddressAllocator:
def test_allocate_creates_ip(self, db):
from ipam.models import IPAddress, Prefix
from netbox_services.engine.context import Context
Prefix.objects.create(prefix="10.99.0.0/24")
allocator = FirstFreeIPAddressAllocator({
"strategy": "first_free",
"prefix": {"type": "prefix", "filters": {}},
})
ip = allocator.allocate(Context(service=None))
assert ip is not None
assert "10.99.0." in str(ip.address)
def test_no_prefix_raises(self, db):
from netbox_services.engine.context import Context
allocator = FirstFreeIPAddressAllocator({
"strategy": "first_free",
"prefix": {"type": "prefix", "filters": {"description": "no-such-prefix"}},
})
with pytest.raises(ValueError):
allocator.allocate(Context(service=None))
@pytest.mark.django_db
class TestSpecificAllocator:
def test_specific_address(self, db):
from netbox_services.engine.context import Context
allocator = SpecificAllocator({"strategy": "specific", "address": "10.50.0.1/24"})
ip = allocator.allocate(Context(service=None))
assert str(ip.address) == "10.50.0.1/24"
def test_specific_requires_address_or_path(self, db):
from netbox_services.engine.context import Context
allocator = SpecificAllocator({"strategy": "specific"})
with pytest.raises(ValueError):
allocator.allocate(Context(service=None))
@pytest.mark.django_db
class TestCreateAllocator:
def test_create_returns_unsaved_instance(self, db):
from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site
from netbox_services.engine.context import Context
mfr = Manufacturer.objects.create(name="alloc-mfr", slug="alloc-mfr")
dt = DeviceType.objects.create(manufacturer=mfr, model="alloc-model", slug="alloc-model")
role = DeviceRole.objects.create(name="alloc-role", slug="alloc-role")
site = Site.objects.create(name="alloc-site", slug="alloc-site")
allocator = CreateAllocator({
"strategy": "create",
"attrs": {
"name": "test-device",
"device_type": dt.pk,
"role": role.pk,
"site": site.pk,
"status": "active",
},
})
ctx = Context(service=None)
obj = allocator.allocate(ctx, model=Device)
assert obj.pk is None
assert obj.name == "test-device"
assert obj.device_type == dt
assert obj.role == role
assert obj.site == site
assert obj.status == "active"
def test_create_with_jinja2_attrs(self, db):
from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site
from tenancy.models import Tenant
from netbox_services.engine.context import Context
mfr = Manufacturer.objects.create(name="jinja-mfr", slug="jinja-mfr")
dt = DeviceType.objects.create(manufacturer=mfr, model="jinja-model", slug="jinja-model")
role = DeviceRole.objects.create(name="jinja-role", slug="jinja-role")
site = Site.objects.create(name="jinja-site", slug="jinja-site")
tenant = Tenant.objects.create(name="jinja-tenant", slug="jinja-tenant")
service = type("FakeService", (), {"tenant": tenant})()
parent = Device(name="parent-dev", device_type=dt, role=role, site=site)
allocator = CreateAllocator({
"strategy": "create",
"attrs": {
"name": "rtr-{{ service.tenant.slug }}-{{ index + 1 }}",
"device_type": dt.pk,
"role": role.pk,
"site": "{{ ..site.pk }}",
"status": "active",
},
})
ctx = Context(service=service, parent_object=parent)
obj = allocator.allocate(ctx, model=Device, index=0, ancestors=[parent])
assert obj.name == "rtr-jinja-tenant-1"
assert obj.site == site
def test_create_requires_model(self, db):
from netbox_services.engine.context import Context
allocator = CreateAllocator({"strategy": "create", "attrs": {}})
with pytest.raises(ValueError):
allocator.allocate(Context(service=None))