NetBox VLAN Translation Rules 深度指南:字段模型、唯一性约束与 REST API/GraphQL 实践
【免费下载链接】netboxThe premier source of truth powering network automation. Open source under Apache 2. Try NetBox Cloud free: https://netboxlabs.com/products/free-netbox-cloud/项目地址: https://gitcode.com/gh_mirrors/ne/netbox
VLAN Translation Rule(VLAN 翻译规则)是 NetBox IPAM 模块中 VLAN 翻译(VLAN Translation)功能的核心数据单元,它定义了一条"本地 VLAN ID(VID)到远端 VID"的一对一映射,多条规则隶属于同一个 VLAN 翻译策略(VLAN Translation Policy)。本文以官方模型文档为主线,结合仓库源码,完整讲解该模型的字段含义、取值约束、唯一性限制,以及如何通过 Web UI、CSV 导入、REST API 与 GraphQL 完成规则的管理与查询,帮助你准确建模跨网络 VLAN 映射关系。
VLAN 翻译规则的定位:策略之下的最小映射单元
VLAN 翻译功能由**策略(Policy)与规则(Rule)**两层构成,详见 VLAN 翻译策略文档:
- 一条策略(如
VLANTranslationPolicy)可挂载多条规则,规则通过外键policy关联到策略; - 每条规则定义一条
local VID -> remote VID的映射; - 策略最终可被赋值到 接口(Interface) 或 虚拟机接口(VMInterface) 上,策略下的所有翻译规则会一并显示在接口详情页中。
在源码层面,这一层级关系由 ipam/models/vlans.py 中的两个模型实现:VLANTranslationPolicy与VLANTranslationRule。其中规则模型的关键字段定义如下:
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
policy | ForeignKey(VLANTranslationPolicy) | on_delete=CASCADE,反向名rules | 规则所属的策略;策略被删除时规则级联删除 |
local_vid | PositiveSmallIntegerField | 1–4094 | 本地网络中的 VLAN ID,将被翻译为远端 VID |
remote_vid | PositiveSmallIntegerField | 1–4094 | 远端网络中对应的 VLAN ID |
description | CharField(max_length=200) | 可空 | 可选描述信息 |
tags/custom_fields | NetBox 标准字段 | — | 由NetBoxModel基类提供,支持打标签与自定义字段 |
规则的字符串表示(__str__)为'100 -> 200 (Policy 1)'这种直观的"本地 VID -> 远端 VID(策略名)"格式,netbox/ipam/models/vlans.py,UI 与 API 中的display字段均基于此生成。
字段取值详解
原文档对三个核心字段逐一说明,下面结合源码中的校验器与表单控件做更深入的展开。
Policy(所属策略)
policy字段指定规则所属的 VLAN Translation Policy。创建规则时必须先存在一个策略对象;prerequisite_models = ('ipam.VLANTranslationPolicy',)声明了这一前置依赖,netbox/ipam/models/vlans.py。在 Web UI 的编辑表单中,该字段使用DynamicModelChoiceField并以selector=True提供弹窗选择器,netbox/ipam/forms/model_forms.py。
Local VID(本地 VLAN ID)
本地网络中待翻译的 VLAN ID,取值范围为 1–4094。源码中通过MinValueValidator(VLAN_VID_MIN)与MaxValueValidator(VLAN_VID_MAX)施加校验,而VLAN_VID_MIN = 1、VLAN_VID_MAX = 4094定义在 netbox/ipam/constants.py。注意该取值区间排除了 0 与 4095(后者常用于 Q-in-Q 等特殊用途)。
Remote VID(远端 VLAN ID)
远端网络中映射目标的 VLAN ID,取值范围同样是 1–4094。它是翻译的目标值,NetBox 只负责记录这条映射关系,实际的报文翻译由外部网络设备依据此配置执行。
唯一性约束:同一策略下不允许 VID 重复
原文档明确指出VLANTranslationRule模型上存在两组唯一性约束:(policy, local_vid)与(policy, remote_vid)。这两条约束以UniqueConstraint形式定义在模型的Meta.constraints中,netbox/ipam/models/vlans.py:
constraints = ( models.UniqueConstraint( fields=('policy', 'local_vid'), name='%(app_label)s_%(class)s_unique_policy_local_vid' ), models.UniqueConstraint( fields=('policy', 'remote_vid'), name='%(app_label)s_%(class)s_unique_policy_remote_vid' ), )对应迁移 netbox/ipam/migrations/0074_vlantranslationpolicy_vlantranslationrule.py 中分别创建了ipam_vlantranslationrule_unique_policy_local_vid与ipam_vlantranslationrule_unique_policy_remote_vid两个数据库级约束。约束的效果可概括为:
允许的组合(同一策略下):
Policy 1: - Rule: 100 -> 200 - Rule: 101 -> 201 Policy 2: - Rule: 100 -> 300 - Rule: 101 -> 301即不同策略之间可以复用相同的 VID 映射;同一策略内,所有规则的 local VID 必须互不相同,所有规则的 remote VID 也必须互不相同。
禁止的组合(同一策略下):
Policy 3: - Rule: 100 -> 200 - Rule: 100 -> 300 # local_vid 100 重复,违反 (policy, local_vid) 约束这两条约束由数据库层强制保证,因此无论是通过 Web UI、CSV 导入还是 REST API 写入,违反约束的重复映射都会被拒绝,从源头保证了"同一接口上同一本地 VID 只存在一种翻译目标"的一致性语义。
变更日志:规则变更归属到所属策略
值得注意的一个实现细节:VLANTranslationRule覆写了to_objectchange(),将规则自身的变更记录(ObjectChange)关联到其所属策略,netbox/ipam/models/vlans.py:
def to_objectchange(self, action): objectchange = super().to_objectchange(action) objectchange.related_object = self.policy return objectchange这意味着在变更日志中,规则的创建、更新、删除事件会以"策略"为关联对象展示,便于从策略视角审计整组翻译配置的演变历史。
Web UI 与表单操作
创建与编辑规则
Web UI 的规则编辑表单VLANTranslationRuleForm将字段组织为policy、local_vid、remote_vid、description、tags五个字段,netbox/ipam/forms/model_forms.py。规则列表与详情页面对应 URL 为/ipam/vlan-translation-rules/与/ipam/vlan-translation-rules/<pk>/,注册于 netbox/ipam/urls.py。
列表表格VLANTranslationRuleTable的默认列为:pk、policy、local_vid、remote_vid、description,其中policy与local_vid列可点击跳转,netbox/ipam/tables/vlans.py。策略列表页还会通过LinkedCountColumn展示每个策略下的规则数量,点击即跳转到该策略的规则列表(url_params={'policy_id': 'pk'}),netbox/ipam/tables/vlans.py。
CSV 批量导入
VLANTranslationRuleImportForm支持通过 CSV 导入规则,policy列按策略名称(to_field_name='name')匹配,必填列仅policy、local_vid、remote_vid三项,netbox/ipam/forms/bulk_import.py。视图测试中的 CSV 示例如下,netbox/ipam/tests/test_views.py:
policy,local_vid,remote_vid Policy 1,103,203 Policy 1,104,204 Policy 2,105,205同样支持带id列的 CSV 更新,如id,local_vid,remote_vid三列形式,netbox/ipam/tests/test_views.py。
批量编辑
批量编辑表单VLANTranslationRuleBulkEditForm允许对选中规则一次性修改policy、local_vid、remote_vid字段,netbox/ipam/forms/bulk_edit.py。
REST API:vlan-translation-rules 端点
VLANTranslationRule通过标准 NetBox ViewSet 暴露为 REST API,路由注册于 netbox/ipam/api/urls.py:
router.register('vlan-translation-rules', views.VLANTranslationRuleViewSet)对应 ViewSet 位于 netbox/ipam/api/views.py,序列化器 netbox/ipam/api/serializers_/vlans.py 暴露的字段为:
id, url, display_url, display, policy, local_vid, remote_vid, description, tags, custom_fields, created, last_updated创建一条规则的请求体示例:
{ "policy": 1, "local_vid": 300, "remote_vid": 400 }这正是 API 测试用例test_create_object所使用的数据形态,netbox/ipam/tests/test_api.py。REST API 同时支持标准的列表、详情、创建、更新、删除与批量操作;policy序列化器还会以嵌套只读形式返回策略下的全部规则(rules字段),netbox/ipam/api/serializers_/vlans.py。
API 过滤由VLANTranslationRuleFilterSet提供,netbox/ipam/filtersets.py,支持的过滤字段包括:
id、policy_id(策略主键)、policy(策略名称)local_vid、remote_vid、description- 全局搜索参数
q与tag
GraphQL 查询
规则同样接入 GraphQL:类型VLANTranslationRuleType定义在 netbox/ipam/graphql/types.py,查询入口为vlan_translation_rule与vlan_translation_rule_list,netbox/ipam/graphql/schema.py。过滤字段在 netbox/ipam/graphql/filters.py 中声明,支持对policy、policy_id、description、local_vid、remote_vid使用查找操作符(lookups)过滤。
一个典型查询示例:
query { vlan_translation_rule_list(local_vid: 100) { id policy { name } local_vid remote_vid description } }全局搜索
规则已注册到 NetBox 全局搜索索引,netbox/ipam/search.py:
class VLANTranslationRuleIndex(SearchIndex): model = models.VLANTranslationRule fields = ( ('policy', 100), ('local_vid', 200), ('remote_vid', 200), ) display_attrs = ('policy', 'local_vid', 'remote_vid')即可以通过策略名或 VID 数值在全局搜索框快速定位规则,权重上策略名(100)优先于 VID(200)。
测试覆盖:行为如何被验证
仓库为 VLAN 翻译规则提供了完整的多层测试佐证:
- 视图测试
VLANTranslationRuleTestCase验证了 Web UI 表单创建(local_vid: 300, remote_vid: 400)、CSV 导入/更新与批量编辑流程,netbox/ipam/tests/test_views.py; - API 测试验证了标准字段(含
display_url、tags、custom_fields、created、last_updated)在响应中齐全,以及标签更新行为,netbox/ipam/tests/test_api.py; - Filterset 测试验证了
policy_id/policy、local_vid、remote_vid、description各过滤条件的命中数量,netbox/ipam/tests/test_filtersets.py。
实践建议
- 先建策略、再建规则:规则强依赖策略存在,建议在创建策略后通过策略详情页的"添加规则"入口批量录入映射,或直接使用 CSV 导入减少重复操作。
- 善用 VID 区间约束:
local_vid与remote_vid均限定在 1–4094,录入前应确认设备侧实际使用的 VLAN 范围,避免超出合法区间。 - 注意唯一性约束带来的设计影响:同一策略内"多对一"(多个 local VID 映射到同一 remote VID)是允许的,但"一对一"的两个方向(同一 local VID 或同一 remote VID 重复)都会被拒绝;若确需同一 VID 映射到不同目标,请拆分到不同策略。
- 审计变更:规则的每次变更都会以所属策略为关联对象记入变更日志,排查问题时可直接按策略维度回溯整组规则的增删改历史。
小结
VLAN 翻译规则是 NetBox 表达"本地 VID 与远端 VID 一对一映射"的标准化载体:字段定义清晰(policy、local_vid、remote_vid、description),数据库层通过(policy, local_vid)与(policy, remote_vid)双重唯一约束保证映射一致性,并提供 Web UI、CSV 导入、REST API(/api/ipam/vlan-translation-rules/)、GraphQL 与全局搜索五种管理路径。结合 VLAN 翻译策略文档 与 接口模型文档,即可在 NetBox 中完整落地跨网络的 VLAN 翻译建模。
【免费下载链接】netboxThe premier source of truth powering network automation. Open source under Apache 2. Try NetBox Cloud free: https://netboxlabs.com/products/free-netbox-cloud/项目地址: https://gitcode.com/gh_mirrors/ne/netbox
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考