*openUBMC 支持Web和Redfish设置和显示182x网卡待生效网口数量详细设计说明书*

<table>
    <tr>
        <td>所属SIG组:</td>
        <td>hardware_sig</td>
    </tr>
    <tr>
        <td>落入版本:</td>
        <td>26.4.0</td>
    </tr>
    <tr>
        <td>设计人员:</td>
        <td>王天贻</td>
    </tr>
    <tr>
        <td>日期:</td>
        <td>2026.02.27</td>
    </tr>
</table>

**Copyright © 2025 openUBMC Community**

您对&quot;本文档&quot;的复制，使用，修改及分发受木兰宽松许可证, 第2版协议(以下简称&quot;MulanPSL2&quot;)的约束。
为了方便用户理解，您可以通过访问<https://license.coscl.org.cn/MulanPSL2>了解MulanPSL2的概要 (但不是替代)。
MulanPSL2的完整协议内容您可以访问如下网址获取：<https://license.coscl.org.cn/MulanPSL2>。

**改版记录**

<table>
    <tr>
        <th>日期</th>
        <th>修订版本</th>
        <th>修订描述</th>
        <th>作者</th>
        <th>审核</th>
    </tr>
    <tr>
        <td>2026.02.27</td>
        <td>V1.0</td>
        <td>初始版本</td>
        <td>xxx</td>
        <td>xxx</td>
    </tr>
</table>

**List of abbreviations**  **缩略语清单** ：

<table>
    <tr>
        <th>Abbreviations 缩略语</th>
        <th>Full spelling 英文全名</th>
        <th>Chinese explanation 中文解释</th>
    </tr>
    <tr>
        <td>BMC</td>
        <td>Baseboard Management Controller</td>
        <td>基板管理控制器</td>
    </tr>
    <tr>
        <td>NIC</td>
        <td>Network Interface Card</td>
        <td>网络接口卡</td>
    </tr>
</table>

[TOC]

# 1.功能分析
## 1.1 功能背景
<!-- 描述该需求的来源或背景，比如：支撑XXX功能、XXX优化等；以及该需求对用户（含组件）带来什么具体价值，如果没有该需求，对用户（含组件）带来什么损失； -->
在"支持1825大板网口数量动态切换"需求中，已经新增了资源协作对象和接口来承载预加载端口数量。本需求在此基础上，在rackmount仓中配置相应的Web和Redfish北向接口，使用户能够通过Web页面和Redfish接口查询和设置182x网卡的待生效网口数量（PreloadPortCount），以及查询允许设置的网口数量可选值（PreloadPortCountAllowableValues）。

## 1.2 功能描述
<!-- 描述该需求交付的整体功能，主要实现XXX功能，解决XXX问题，明确方案如何实现 -->
在rackmount仓的北向接口配置中，新增Web和Redfish接口配置，支持以下功能：
1. **Redfish接口**：在GET操作中查询`PreloadPortCount`和`PreloadPortCountAllowableValues`；在PATCH操作中设置`PreloadPortCount`，调用资源协作方法`SetPortCount`进行网口数量切换；
2. **Web接口**：在GET操作中查询`PortCount`（当前生效网口数量）、`PreloadPortCount`（待生效网口数量）和`PreloadPortCountAllowableValues`（可选值列表）；在PATCH操作中设置`PreloadPortCount`；
3. **参数校验**：PATCH操作中对`PreloadPortCount`进行Validator校验，包括检查该网卡是否具备PortConfig接口以及设置的值是否在AllowableValues范围内。

## 1.3 功能场景
<!-- 描述该需求的业务使用场景，内容包括：
1) 场景出发条件及对象：什么角色/工具/接口等在什么具体情况下使用该特性，使用对象技能如何？
2) 使用时间及频度
3) 描述该特性主要有哪些场景、子场景及关键任务操作 -->
1. 用户通过Web页面查看网卡当前生效的网口数量（PortCount）、待生效网口数量（PreloadPortCount）及可选值列表（PreloadPortCountAllowableValues）；
2. 用户通过Web页面设置待生效网口数量；
3. 用户通过Redfish接口查询待生效网口数量及可选值；
4. 用户通过Redfish接口设置待生效网口数量；
5. 对不具备PortConfig接口的网卡，设置操作返回错误提示。

## 1.4 功能列表
<!-- 描述该需求交付的功能列表，内容包括：列出功能详细描述，标题、描述。 -->
| 功能编号 | 功能标题 | 功能描述 |
| ------- | ------- | -------- |
| 1 | Redfish查询待生效网口数量 | 通过Redfish GET接口查询PreloadPortCount和PreloadPortCountAllowableValues |
| 2 | Redfish设置待生效网口数量 | 通过Redfish PATCH接口设置PreloadPortCount，调用SetPortCount方法 |
| 3 | Web查询网口数量信息 | 通过Web GET接口查询PortCount、PreloadPortCount和PreloadPortCountAllowableValues |
| 4 | Web设置待生效网口数量 | 通过Web PATCH接口设置PreloadPortCount，调用SetPortCount方法 |
| 5 | PATCH参数校验 | 校验网卡是否具备PortConfig接口，校验设置值是否在AllowableValues范围内 |

# 2.功能设计
## 2.1 总体方案分析
<!-- 描述该方案的总体设计（注：相关输出方案可同步刷新到各组件仓） -->

### 2.1.1 方案详细设计
#### 2.1.1.1 方案概述
<!-- 描述该方案的整体实现，内容包括：涉及的关键点，实现策略等 -->
本方案在rackmount仓中配置北向接口（Redfish和Web），通过映射配置文件（mapping_config）调用network_adapter组件已有的资源协作接口和方法，实现对182x网卡待生效网口数量的查询和设置。

**核心资源协作接口和属性映射关系：**

| 前端/接口字段 | 资源协作接口 | 资源协作属性 | 说明 |
|---|---|---|---|
| PortCount | bmc.kepler.Systems.NetworkAdapter | NetworkPortCount | 当前实际生效的网口数量（仅Web接口） |
| PreloadPortCount | bmc.kepler.Systems.NetworkAdapter.PortConfig | PortCount | 待生效的网口数量 |
| PreloadPortCountAllowableValues | bmc.kepler.Systems.NetworkAdapter.PortConfig | PortCountAllowableValues | 允许设置的网口数量可选值 |

**资源协作方法：**
- `SetPortCount`：位于`bmc.kepler.Systems.NetworkAdapter.PortConfig`接口下，用于设置预加载端口数量。

**关键设计点：**
1. 通过`MdbService.GetPath`方法根据`NodeId`动态获取对应网卡的PortConfig对象路径；
2. 环境中存在多种网卡，部分网卡不具备PortConfig接口，需要通过Validator + CheckUri机制进行校验和抛错；
3. PATCH操作使用`CallIf`条件控制，确保仅在请求体中包含`PreloadPortCount`字段时才执行相关步骤；
4. Web接口额外展示当前生效的网口数量（PortCount），来自`bmc.kepler.Systems.NetworkAdapter`接口的`NetworkPortCount`属性。

#### 2.1.1.2 开发视图
<!-- 开发视图面向系统开发及软件管理，描述系统代码结构，构建结构的视图，主要解决系统技术实现和开发的问题，它依托逻辑视图，描述代码、构建结构 -->

N/A

#### 2.1.1.3 运行视图
<!-- 运行视图面向系统运行，描述系统启动过程、运行期交互的视图，主要解决系统运行期交互，描述各可执行交付件在运行期的交互关系 -->
**Redfish 设置待生效网口数量流程**

```mermaid
sequenceDiagram
    participant User as 用户
    participant Redfish as Redfish接口
    participant MdbService as MdbService
    participant PortConfig as PortConfig对象
    participant NA as NetworkAdapter对象

    User->>Redfish: PATCH /redfish/v1/Chassis/:chassisid/NetworkAdapters/:networkadapterid<br>{"Oem":{"OemIdentifier":{"PreloadPortCount":2}}}
    Redfish->>MdbService: GetPath(bmc.kepler.Systems.NetworkAdapter, NodeId)
    MdbService-->>Redfish: NetworkAdapter路径
    Redfish->>MdbService: GetPath(bmc.kepler.Systems.NetworkAdapter.PortConfig, NodeId) [CheckUri]
    MdbService-->>Redfish: PortConfig路径
    Redfish->>PortConfig: 读取PortCountAllowableValues
    Redfish->>Redfish: Validator校验：PortConfig是否存在、值是否在AllowableValues中
    Redfish->>PortConfig: SetPortCount(PreloadPortCount)
    PortConfig-->>Redfish: 返回结果
    Redfish-->>User: 200 OK
```

**Web 查询网口数量信息流程**

```mermaid
sequenceDiagram
    participant User as 用户
    participant Web as Web接口
    participant MdbService as MdbService
    participant NA as NetworkAdapter对象
    participant PortConfig as PortConfig对象

    User->>Web: GET /UI/Rest/System/NetworkAdapter/:adapterId
    Web->>MdbService: GetPath(bmc.kepler.Systems.NetworkAdapter, NodeId)
    MdbService-->>Web: NetworkAdapter路径
    Web->>NA: 读取属性（含NetworkPortCount→PortCount）
    Web->>MdbService: GetPath(bmc.kepler.Systems.NetworkAdapter.PortConfig, NodeId)
    MdbService-->>Web: PortConfig路径
    Web->>PortConfig: 读取PortCount→PreloadPortCount, PortCountAllowableValues
    Web->>Web: Lua脚本构造响应体（含PortCount, PreloadPortCount, PreloadPortCountAllowableValues）
    Web-->>User: 返回JSON响应
```

### 2.1.2 内部依赖分析
<!-- 是否涉及与其他组件接口依赖，如果涉及需要确认当前是否已完成，是否匹配当前需求开发诉求 -->
依赖network_adapter组件提供的资源协作接口：
- `bmc.kepler.Systems.NetworkAdapter`接口下的`NetworkPortCount`属性
- `bmc.kepler.Systems.NetworkAdapter.PortConfig`接口下的`PortCount`、`PortCountAllowableValues`属性和`SetPortCount`方法

以上接口已在"支持1825大板网口数量动态切换"需求中实现。

### 2.1.3 外部依赖分析
<!-- 是否涉及与平台SDK的依赖关系 -->
不涉及

### 2.1.4 北向接口分析
<!-- 需要分析当前功能是否有以下接口影响，如果有影响，则需要具体的补充影响点。其中注意点如下：
（1）如果有新增IPMI接口，请排查代码中IPMI命令注册的过滤字段，是否完全和IPMI命令的定义一致？
（2）新增一个接口时，需要咨询SIG组是否还有其他的接口受影响 -->
| 特性 | SNMP | CLI | WEB | KVM_VMM | IPMI(RMCP/RMCP+) | HMM | Redfish |
| ---- | ---- | ---- | --- | ------ | ---------------- | --- | ------- |
| 查询和设置待生效网口数量 | NA | NA | √ | NA | NA | NA | √ |

#### Redfish接口

**URI：** `/redfish/v1/Chassis/:chassisid/NetworkAdapters/:networkadapterid`

**GET响应体新增字段（位于Oem下）：**

| 字段 | 类型 | 说明 |
|---|---|---|
| PreloadPortCount | integer | 待生效的网口数量 |
| PreloadPortCountAllowableValues | array | 允许设置的网口数量可选值列表 |

**PATCH请求体：**
```json
{
    "Oem": {
        "{{OemIdentifier}}": {
            "PreloadPortCount": 2
        }
    }
}
```

#### Web接口

**URI：** `/UI/Rest/System/NetworkAdapter/:adapterId`

**GET响应体新增字段：**

| 字段 | 类型 | 说明 |
|---|---|---|
| PortCount | integer | 当前实际生效的网口数量 |
| PreloadPortCount | integer | 待生效的网口数量 |
| PreloadPortCountAllowableValues | array | 允许设置的网口数量可选值列表 |

**PATCH请求体：**
```json
{
    "PreloadPortCount": 2
}
```

### 2.1.5 兼容性分析
<!-- 当前的功能对现有在网的功能是否有影响，具体的影响点进行分析之后输出影响分析表格 -->
对现有功能无影响，仅在GET响应中新增字段，PATCH新增可选参数，不影响已有接口行为。

### 2.1.6 定制化接口分析
<!-- 如果支持定制化设置，则需要给出定制化时的默认值（空定制化项条件下的设置值），如果涉及到定制化接口变更或新增，注意定制化接口文档需配套修改。注意定制化默认值变更对白牌包的影响 -->
不涉及

### 2.1.7 导入导出分析
<!-- 如果支持导入导出的配置，则需要分析导入导出的schema。 -->
不涉及（导入导出在"支持1825大板网口数量动态切换"需求中处理）

### 2.1.8 传感器分析
<!-- 如果需要新增传感器，则需要提前登记和评审新增的传感器要素。新增传感器评审需要上SIG-Interface进行评审 -->
不涉及

### 2.1.9 精准告警事件分析
<!-- 如果需要新增事件，则需要提前登记和评审新增的时间要素 -->
不涉及

### 2.1.10 系统锁定分析
<!-- 对外的接口或者命令是否支持系统锁定 -->
不涉及

### 2.1.11 用例场景分析
<!-- 以表格的形式输出该需求涉及的用例场景 -->
| 用例编号 | 前置条件 | 场景 | 预期 |
| ---- | ---- | ---- | ---- |
| 1 | 网卡具备PortConfig接口 | Redfish GET查询网卡信息 | 响应体包含PreloadPortCount和PreloadPortCountAllowableValues |
| 2 | 网卡具备PortConfig接口 | Web GET查询网卡信息 | 响应体包含PortCount、PreloadPortCount和PreloadPortCountAllowableValues |
| 3 | 网卡具备PortConfig接口 | Redfish PATCH设置PreloadPortCount为AllowableValues中的合法值 | 设置成功，返回200 |
| 4 | 网卡具备PortConfig接口 | Web PATCH设置PreloadPortCount为AllowableValues中的合法值 | 设置成功，返回200 |
| 5 | 网卡具备PortConfig接口 | PATCH设置PreloadPortCount为AllowableValues之外的值 | 设置失败，返回PropertyValueNotInList错误 |
| 6 | 网卡不具备PortConfig接口 | PATCH设置PreloadPortCount | 设置失败，返回PropertyModificationNotSupported错误 |
| 7 | 网卡不具备PortConfig接口 | GET查询网卡信息 | 响应体不包含PreloadPortCount和PreloadPortCountAllowableValues字段 |

## 2.2 非功能质量属性设计
### 2.2.1 扩展性分析
<!-- 考虑后续新增类似功能可以很好地扩展 -->
不涉及

### 2.2.2 重用性分析
<!-- 是否为通用处理方式、接口，如果是得考虑重用性 -->
不涉及

### 2.2.3 可测试性分析
<!-- 此需求如何验证，是否可直接验证，or通过XXX功能覆盖验证，or需要单独怎加测试接口验证 -->
通过Redfish接口和Web接口直接验证

### 2.2.4 资料分析
<!-- 是否涉及资料修改 -->
需修改Redfish和Web接口资料，增加PreloadPortCount、PreloadPortCountAllowableValues及PortCount（仅Web）相关接口说明

### 2.2.5 资源使用分析
<!-- 新增线程、内存分配、模型属性名长度是否合理，CPU占用率是否会激增，Flash中新增文件是否合理（频繁读写Flash会大幅缩短emmc寿命）；是否涉及消息队列，如果涉及请检查是否存在某些场景下消息队列会满导致消息丢失，例如大量消息发送到队列且处理消息需要耗费较长时间的场景。 -->
不涉及，仅为接口配置变更，无新增资源占用

### 2.2.6 可靠性分析
| 编号 | 场景 | 问题描述 | 可靠性影响 | 问题级别 | 建议解决方案/需求 | 讨论结果 | 跟踪人 | 备注 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 1 | 网卡不具备PortConfig接口时调用PATCH | 访问不存在的资源协作路径 | PATCH请求失败 | 一般 | 在Validator中提前校验并抛错 | | | |
| 2 | 设置非法的预加载网口数量 | 设置预加载网口数量失败 | PATCH请求失败 | 一般 | 在Validator中提前校验并抛错 | | | |

### 2.2.7 安全性分析
| 安全合规项 | 是否涉及 | 现有的防护措施 |
| --- | --- | --- |
| 访问控制（通道、文件权限、用户权限、查询权限、配置权限、接口权限） | 正常权限 | 复用现有NetworkAdapter接口的权限控制 |
| 敏感数据 | 不涉及 | |
| 日志（操作日志、维护日志、安全日志、运行日志） | 设置有操作日志 | PATCH操作由框架自动记录操作日志 |
| 文档 | 不涉及 | |
| 加密及算法 | 不涉及 | |
| 新增关键资源（密钥、证书、关键配置）备份、恢复 | 不涉及 | |
| 新增对外接口入参校验 | 涉及 | 通过Validator Script校验PreloadPortCount合法性 |
| 新增开源及三方软件引入 | 不涉及 | |

# 3.功能实现
<!-- 通过表格、流程图、简明文字描述提供，力求容易看懂、容易实现，详细描述细节。 -->
## 3.1 Redfish接口配置
### 3.1.1 功能实现设计

**涉及文件：** `rackmount/interface_config/redfish/mapping_config/Chassis/NetworkAdapters/NetworkAdapters.json`

**URI：** `/redfish/v1/Chassis/:chassisid/NetworkAdapters/:networkadapterid`

**涉及资源协作接口：**
- `bmc.kepler.Mdb`（GetPath方法）
- `bmc.kepler.Systems.NetworkAdapter.PortConfig`（PortCount、PortCountAllowableValues属性，SetPortCount方法）

**操作概述：**
- GET操作：在ProcessingFlow末尾新增步骤获取PortConfig路径和属性，在RspBody的`Oem.{{OemIdentifier}}`下新增`PreloadPortCount`和`PreloadPortCountAllowableValues`字段；
- PATCH操作：在`ReqBody.Oem.{{OemIdentifier}}`下新增`PreloadPortCount`字段（integer类型），配置Validator校验脚本，新增ProcessingFlow步骤完成校验和设置。

### 3.1.2 功能详细设计

#### GET操作新增步骤

在现有GET操作的ProcessingFlow末尾新增两个步骤，并在RspBody中引用：

| 新增步骤 | 类型 | 接口/方法 | 说明 |
|---|---|---|---|
| ProcessingFlow[12] | Method | `bmc.kepler.Mdb.GetPath` | 以`NodeId=${Uri/networkadapterid}`获取PortConfig对象路径，参数`false`允许路径为空 |
| ProcessingFlow[13] | Property | `bmc.kepler.Systems.NetworkAdapter.PortConfig` | 读取PortCount→PreloadPortCount、PortCountAllowableValues→PreloadPortCountAllowableValues |

**RspBody新增字段**（位于`Oem.{{OemIdentifier}}`下）：

| RspBody字段 | 数据来源 |
|---|---|
| PreloadPortCount | `ProcessingFlow[13]/Destination/PreloadPortCount` |
| PreloadPortCountAllowableValues | `ProcessingFlow[13]/Destination/PreloadPortCountAllowableValues` |

> 注：如果网卡不具备PortConfig接口，ProcessingFlow[12]返回空路径，ProcessingFlow[13]不会执行，RspBody中对应字段自然不展示。

#### PATCH操作新增步骤

在现有PATCH操作的ProcessingFlow末尾新增三个步骤：

| 新增步骤 | 类型 | 接口/方法 | 说明 | 执行条件 |
|---|---|---|---|---|
| ProcessingFlow[4] | Method | `bmc.kepler.Mdb.GetPath` | 获取PortConfig对象路径 | CallIf: `CheckUri`（始终执行，供Validator使用） |
| ProcessingFlow[5] | Property | `bmc.kepler.Systems.NetworkAdapter.PortConfig` | 读取PortCount和PortCountAllowableValues | CallIf: `{"${ReqBody/Oem/{{OemIdentifier}}/PreloadPortCount}": "#WITH"}` |
| ProcessingFlow[6] | Method | `SetPortCount` | 调用SetPortCount设置待生效网口数量 | CallIf: `{"${ReqBody/Oem/{{OemIdentifier}}/PreloadPortCount}": "#WITH"}` |

> ProcessingFlow[4]使用`CheckUri`始终执行，以便Validator可以引用其结果；ProcessingFlow[5]和[6]仅在请求体包含`PreloadPortCount`时执行，避免对其他PATCH字段（如`HotPlugAttention`）产生副作用。

#### PATCH操作Validator校验逻辑

`PreloadPortCount`字段配置了Script类型的Validator，校验逻辑如下：

1. **检查PortConfig接口是否存在：** 判断`ProcessingFlow[4].Destination`是否为nil或Path为空。如果不存在，说明当前网卡不支持网口数量配置，调用`error(custom_messages.PropertyModificationNotSupported('PreloadPortCount'))`抛出错误；
2. **检查设置值是否合法：** 从`ProcessingFlow[5].Destination.PreloadPortCountAllowableValues`获取允许值列表，遍历检查用户输入值`Input`是否在列表中。如果不在，调用`error(base_messages.PropertyValueNotInList(Input, 'PreloadPortCount'))`抛出错误；
3. 校验通过返回`true`，随后ProcessingFlow[6]调用`SetPortCount`方法完成设置。

### 3.1.3 开发者测试
#### 3.1.3.1 单元测试
N/A

#### 3.1.3.2 集成测试
N/A

## 3.2 Web接口配置
### 3.2.1 功能实现设计

**涉及文件：**
- `rackmount/interface_config/web_backend/mapping_config/System/NetworkAdapter.json`
- `rackmount/interface_config/web_backend/script/Systems/get_adapter_rspbody.lua`

**URI：** `/UI/Rest/System/NetworkAdapter/:adapterid`

**涉及资源协作接口：**
- `bmc.kepler.Mdb`（GetPath方法）
- `bmc.kepler.Systems.NetworkAdapter`（NetworkPortCount属性）
- `bmc.kepler.Systems.NetworkAdapter.PortConfig`（PortCount、PortCountAllowableValues属性，SetPortCount方法）

**操作概述：**
- GET操作：在已有ProcessingFlow[3]中新增`NetworkPortCount`→`PortCount`映射，ProcessingFlow末尾新增步骤获取PortConfig路径和属性，Lua脚本中新增`PortCount`、`PreloadPortCount`、`PreloadPortCountAllowableValues`响应体字段构造；
- PATCH操作：在ReqBody中新增`PreloadPortCount`字段（integer类型），配置Validator校验脚本，新增ProcessingFlow步骤完成校验和设置。

### 3.2.2 功能详细设计

#### GET操作新增步骤

1. 在已有ProcessingFlow[3]（读取NetworkAdapter属性）的Destination中新增映射：`"NetworkPortCount": "PortCount"`，用于获取当前实际生效的网口数量。

2. 在ProcessingFlow末尾新增两个步骤：

| 新增步骤 | 类型 | 接口/方法 | 说明 |
|---|---|---|---|
| ProcessingFlow[9] | Method | `bmc.kepler.Mdb.GetPath` | 以`NodeId=${Uri/adapterid}`获取PortConfig对象路径，参数`false`允许路径为空 |
| ProcessingFlow[10] | Property | `bmc.kepler.Systems.NetworkAdapter.PortConfig` | 读取PortCount→PreloadPortCount、PortCountAllowableValues→PreloadPortCountAllowableValues |

#### GET操作Lua脚本逻辑（get_adapter_rspbody.lua）

在Lua脚本中新增以下响应体构造逻辑：

1. `rspbody.PortCount`：直接从`ProcessingFlow[3].Destination.PortCount`获取（来自NetworkAdapter接口的`NetworkPortCount`属性）；
2. `rspbody.PreloadPortCount`和`rspbody.PreloadPortCountAllowableValues`：先判断`ProcessingFlow[10]`及其`Destination`是否存在（兼容不具备PortConfig接口的网卡），存在时赋值；
3. `PreloadPortCountAllowableValues`是数组类型，使用`cjson.json_object_new_array()`创建JSON数组，再遍历赋值，确保序列化为JSON数组格式而非对象格式。

#### PATCH操作新增步骤

在现有PATCH操作的ProcessingFlow末尾新增三个步骤：

| 新增步骤 | 类型 | 接口/方法 | 说明 | 执行条件 |
|---|---|---|---|---|
| ProcessingFlow[3] | Method | `bmc.kepler.Mdb.GetPath` | 获取PortConfig对象路径 | CallIf: `CheckUri`（始终执行，供Validator使用） |
| ProcessingFlow[4] | Property | `bmc.kepler.Systems.NetworkAdapter.PortConfig` | 读取PortCount和PortCountAllowableValues | CallIf: `{"${ReqBody/PreloadPortCount}": "#WITH"}` |
| ProcessingFlow[5] | Method | `SetPortCount` | 调用SetPortCount设置待生效网口数量 | CallIf: `{"${ReqBody/PreloadPortCount}": "#WITH"}` |

> ProcessingFlow[3]使用`CheckUri`始终执行，以便Validator可以引用其结果；ProcessingFlow[4]和[5]仅在请求体包含`PreloadPortCount`时执行，不影响已有的`AdapterId`热插拔操作。

#### PATCH操作Validator校验逻辑

Validator校验逻辑与Redfish PATCH一致：

1. **检查PortConfig接口是否存在：** 判断`ProcessingFlow[3].Destination`是否为nil或Path为空，不存在时调用`error(custom_messages.PropertyModificationNotSupported('PreloadPortCount'))`抛出错误；
2. **检查设置值是否合法：** 从`ProcessingFlow[4].Destination.PreloadPortCountAllowableValues`获取允许值列表，遍历检查输入值是否在列表中，不在则调用`error(base_messages.PropertyValueNotInList(Input, 'PreloadPortCount'))`抛出错误；
3. 校验通过返回`true`，随后ProcessingFlow[5]调用`SetPortCount`方法完成设置。

### 3.2.3 开发者测试
#### 3.2.3.1 单元测试
N/A

#### 3.2.3.2 集成测试
N/A

## 3.3 涉及修改文件清单

| 序号 | 仓库 | 文件路径 | 修改类型 | 说明 |
| --- | --- | --- | --- | --- |
| 1 | rackmount | interface_config/redfish/mapping_config/Chassis/NetworkAdapters/NetworkAdapters.json | 修改 | Redfish GET新增ProcessingFlow和RspBody字段；PATCH新增ReqBody字段、Validator、ProcessingFlow步骤 |
| 2 | rackmount | interface_config/web_backend/mapping_config/System/NetworkAdapter.json | 修改 | Web GET新增ProcessingFlow和Destination映射；PATCH新增ReqBody字段、Validator、ProcessingFlow步骤 |
| 3 | rackmount | interface_config/web_backend/script/Systems/get_adapter_rspbody.lua | 修改 | Lua脚本新增PortCount、PreloadPortCount和PreloadPortCountAllowableValues响应体构造逻辑 |
