NetBox 冷却回路建模:Cooling Outflow 设备组件深度解析
2026/9/20 12:32:13 网站建设 项目流程
  • 后端
  • 网络
  • 数据建模

【免费下载链接】netbox

The 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
点击查看免费下载

本指南以 NetBox DCIM 模块中的冷却回路建模为核心,聚焦Cooling Outflow(冷却出口)这一设备组件:它是液冷回路冷侧(供液侧)的供液点,负责把冷却液输送给下游设备。读者将掌握 Cooling Outflow 的字段语义、与 Cooling Intake / Cooling Feed 的上下游关系、基于模板的自动实例化机制,以及 REST API、GraphQL、过滤与校验等完整的落地用法,可用于在 NetBox 中如实记录 CDU、歧管(manifold)等机柜内液冷设备。

概述:什么是 Cooling Outflow

Cooling Outflow 是 NetBox v4.7 引入的冷却(Cooling)特性中的一种设备组件(device component)。它向下游的 Cooling Intake(冷却入口)输送冷却液,通常代表冷却液分配单元(CDU)或歧管上的一个出口。

一个关键的语义点是:Cooling Outflow 是回路冷侧(cold / coolant-distribution side)供液(supply)点,它把冷却液继续传递给下游设备,不代表将升温后的冷却液回流至冷却源。回流路径不按组件单独建模;而是由单个 Cooling Feed 代表整个回路,同时覆盖供液(冷)与回流(暖)两条路径。冷却模型的完整层级为:

cooling source(冷却源)→ cooling feed(冷却回路)→ device cooling intake / cooling outflow(设备冷却入口 / 出口)

关于整个冷却模型(冷却源、回路、机柜与设备属性)的总体介绍,可参阅 Cooling 功能文档。

字段详解

以下字段在 UI 表单、REST API 序列化器与 GraphQL 类型中均可用,其定义可在 device_components.py 中对应模型CoolingOutflow找到。

Device(所属设备)

该冷却出口所属的设备。这是所有设备组件的强制性归属字段,决定了组件在 DCIM 层级中的位置。

Module(所属模块)

安装于该设备内的模块(可选)。由于CoolingOutflow继承自ModularComponentModel(模块化组件模型),它既可以挂载在设备本体上,也可以挂载在设备内的可插拔模块上——这与接口、电源端口等模块化组件的行为一致。

Name(名称)

冷却出口的名称必须在其父设备内唯一

Label(标签)

用于标识该冷却出口的替代物理标签。当组件实际印刷在物理设备上的标识与名称不同时,可用 Label 记录真实铭牌文字,与 Name 解耦。

Connector Type(连接器类型)

物理冷却液连接器类型。底层枚举定义于 choices.py 的CoolingConnectorTypeChoices,完整选项如下:

取值(value)显示文本
uqdUQD(Universal Quick Disconnect,通用快插接头)
uqdbUQDB(Universal Quick Disconnect, Blind-mate,通用盲插快插接头)
qdcQDC(Quick Disconnect Coupling,快插耦合)
camlockCamlock(cam-and-groove,凸轮锁紧/槽式快接)
nptNPT(threaded,NPT 螺纹)
bspBSP(threaded,BSP 螺纹)
proprietaryProprietary(厂商私有)

在模型中该字段为max_length=50的 CharField,可留空(blank=True, null=True)。

Diameter(直径)

连接器的直径:一个数值加上可选的单位(毫米mm、厘米cm或英寸in)。该字段由DiameterMixin提供(见 mixins.py),其约束为:

  • 必须是在所选单位下的正数、非零值(底层校验器为MinValueValidator(Decimal('0.01'))),或者留空;
  • 设置直径时必须同时指定单位,否则clean()会抛出"Must specify a unit when setting a diameter"校验错误;
  • 数据库中还维护了一个规格化列_abs_diameter(归一化为毫米),用于跨单位混合排序与过滤;save()通过normalize_diameter()在保存时写入该列。

Cooling Intake(上游冷却入口)

同一设备上为该出口供液的上游 Cooling Intake(可选)。模型通过外键cooling_intake关联,语义是:设备通过入口取入冷却液,再经由出口继续向下游传递——典型场景即 CDU 或歧管:设备自身有一个 facility 入口(intake),把冷却液分配给多个下游出口(outflow)。

该关联有两个值得注意的校验规则(见 device_components.py):

  1. 同设备校验:如果指定了cooling_intake,则该入口必须与出口属于同一设备,否则抛出"Parent cooling intake (…) must belong to the same device"
  2. 环路检测clean()会调用validate_cooling_loop(),防止 intake → outflow → intake … 的引用链形成环路(详见下文“环路检测”一节)。

在冷却模型中的位置:与 Intake、Feed 的关系

供液侧的入口与出口

冷却回路的两类设备组件都位于供液(冷)侧:Cooling Intake接收冷却液,Cooling Outflow 把冷却液继续传递给下游设备。两者通过引用关系连接——液冷软管不作为结构化布线(cable)建模,而是入口直接引用供液给它的出口:

  • CoolingIntake.cooling_outflow:指向供应本入口的上游出口;
  • CoolingOutflow.cooling_intake:指向同设备上为本出口供液的入口。

从模型注释(device_components.py)可以确认一个设计差异:入口的上游出口通常位于另一台设备(如 CDU),因此CoolingIntakeTemplate有意提供“上游出口”字段;而出口的父级入口位于同一设备,所以CoolingOutflowTemplate可以模板化该关联。

回流路径由 Feed 统一表达

升温冷却液的回流路径不按组件建模。单个 Cooling Feed 代表整个回路(同时覆盖供液冷路与回流暖路),其下游入口是根据所服务机柜内安装的设备推导出来的,而非显式引用。换句话说:路径追踪就是沿着“入口↔出口”引用链行走,整条回路的供/回信息则由 Feed 承载。

机柜内液冷设备如何建模

CDU、歧管、机柜后门热交换器(RDHx)在 NetBox 中没有专用模型,而是建模为安装在机柜中的普通(通常为 0U)Device(与 PDU 建模方式一致):品牌型号来自 Device Type,冷却连接通过 Cooling Intake / Cooling Outflow 组件表达,服务于这类设备的 Feed 由其所在机柜推导。

从模板自动实例化

和大多数设备组件一样,Cooling Outflow 会在创建设备时自动从分配给所选设备类型的 Cooling Outflow 模板 实例化

模板模型CoolingOutflowTemplate定义于 device_component_templates.py,其关键实现要点:

  • 继承DiameterMixinModularComponentTemplateModel,通过component_model = CoolingOutflow声明其产物模型;
  • 模板自身也可以引用同一设备类型/模块类型下的CoolingIntakeTemplate作为父级入口(外键cooling_intake),并在clean()中校验“父入口必须属于同一设备类型/模块类型”;
  • instantiate()(device_component_templates.py)在创建设备时解析名称/标签,查找对应的父入口实例,并把模板的typediameterdiameter_unit等属性复制到新组件上;由于批量创建走bulk_create()会绕过save(),它还会直接补充写入规格化的_abs_diameter列。

环路检测:保证冷却引用链无环

CoolingLoopValidationMixin(见 mixins.py)为冷却组件链提供环路检测。由于入口、出口交替引用(Intake → Outflow → Intake …),每个具体模型声明upstream_field指向其“上游外键”:

  • CoolingIntake.upstream_field = 'cooling_outflow'
  • CoolingOutflow.upstream_field = 'cooling_intake'

validate_cooling_loop()的实现策略是:每次跃迁只解析下一个外键 ID(单次索引列查询,不加载完整关联对象),并用(model, pk)组成的seen集合保证终止;一旦发现重复访问即抛出"Cooling intake and outflow assignments cannot form a loop."。两个模型都在各自的clean()中调用该方法,因此无论从入口还是出口侧建立引用,都能在对象级校验阶段拦截环路。

REST API 使用

Cooling Outflow 通过CoolingOutflowViewSet(见 api/views.py)暴露为 REST API 资源,序列化器定义于 api/serializers_/device_components.py。API 端点路径遵循 NetBox 惯例:

  • GET/POST /api/dcim/cooling-outflows/:列表 / 创建;
  • GET/PATCH/PUT/DELETE /api/dcim/cooling-outflows/{id}/:详情 / 局部更新 / 全量更新 / 删除。

典型创建请求示例:

POST /api/dcim/cooling-outflows/ { "device": 42, "name": "outlet-1", "type": "uqdb", "diameter": 12.7, "diameter_unit": "mm", "cooling_intake": 10 }

其中device必填,name在父设备内唯一,diameter_unit支持mm/cm/in(枚举见 netbox/choices.py),cooling_intake必须指向同一设备上的入口。API 层同样会触发模型clean()中的同设备校验与环路检测。对应模板资源的端点为/api/dcim/cooling-outflow-templates/(视图见 api/views.py)。

GraphQL 支持

Cooling Outflow 在 GraphQL 中也可用:CoolingOutflowTypeCoolingOutflowTemplateType定义于 graphql/types.py,过滤器CoolingOutflowFilter/CoolingOutflowTemplateFilter定义于 graphql/filters.py。典型查询:

query { cooling_outflow_list(device_id: 42) { name type diameter diameter_unit cooling_intake { name } } }

过滤、表格与界面

  • FiltersetCoolingOutflowFilterSet(filtersets.py)继承ModularDeviceComponentFilterSet,支持按设备、模块、名称、类型、直径等标准组件条件过滤;UI 侧对应表单为CoolingOutflowFilterForm(forms/filtersets.py)。
  • 表格CoolingOutflowTable(tables/cooling.py)定义列表视图列。
  • 视图:UI 视图族位于 views.py,覆盖列表、详情、创建(支持批量创建)、编辑、删除、批量导入、批量编辑、批量重命名、批量删除等完整 CRUD 操作。
  • 属性面板:详情页右侧属性面板由CoolingOutflowPanel(ui/panels.py)渲染。
  • 搜索CoolingOutflowIndex(search.py)将冷却出口纳入全局搜索索引。

测试覆盖

仓库为该组件提供了完整的自动化测试,可作为理解行为与预期语义的参考:

  • API 测试:CoolingOutflowTestCase(tests/test_api.py)与模板测试CoolingOutflowTemplateTestCase(tests/test_api.py);
  • 视图测试:CoolingOutflowTestCase(tests/test_views.py)继承DeviceComponentViewTestCase
  • Filterset 测试:CoolingOutflowTestCase(tests/test_filtersets.py);
  • 表格测试:CoolingOutflowTableTestCase(tests/test_tables.py)。

实战建模示例

以一台带两个出口的 CDU 设备为例,完整的建模路径是:

  1. 设备类型:为 CDU 型号创建 Device Type,并添加一个CoolingIntakeTemplate(如facility-in,连接器qdc、直径25 mm)和两个CoolingOutflowTemplate(如outlet-1outlet-2),每个出口模板的父入口引用facility-in模板;
  2. 创建设备:在机柜中创建该型号设备(通常为 0U),组件将从模板自动实例化,且出口自动关联到新设备上实例化出的入口;
  3. 连接下游:编辑服务器等下游设备的 Cooling Intake,将其cooling_outflow指向该 CDU 的某个出口;
  4. 建立回路:为该机柜创建 Cooling Feed,关联上游 Cooling Source,并填写额定冷却能力(kW)与最大流量;
  5. 路径追踪:沿“入口 ↔ 出口”引用链即可完成组件级追踪,供液/回流整体信息由 Feed 承载。

小结

Cooling Outflow 是 NetBox 液冷建模中承上启下的设备组件:它接收同设备入口的冷却液并继续传递给下游设备,构成“冷却源 → 冷却回路 → 设备入口/出口”层级中的组件层。理解其供液侧定位、同设备父入口约束、环路检测机制、模板自动实例化这四件事,就掌握了在 NetBox 中准确记录 CDU / 歧管 / RDHx 等液冷设备的关键。继续深入可阅读 Cooling 功能总览 与 Cooling Intake、Cooling Feed、Cooling Outflow 模板 等关联模型文档。

  • 后端
  • 网络
  • 数据建模

【免费下载链接】netbox

The 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询