将 NetQ API 与您的应用程序集成
NetQ API 提供有关您的网络及其设备的性能和操作的数据。您可以使用内部工具或第三方分析工具查看数据。API 显示各个交换机的运行状况、网络协议和服务、跟踪和验证结果,以及全网络清单和事件。
本指南概述了 NetQ API 框架,包括使用 Swagger UI 2.0 或 `bash` 加 `curl` 查看和测试 API 的基础知识。每个端点和模型参数的描述都在单独的 API JSON 文件中。
API 组织
NetQ API 提供以下端点:
- 网络协议:BGP、EVPN、LLDP、CLAG、MSTP、Neighbors、NTP、路由
- 虚拟网络:VLAN
- 服务:服务
- 接口:接口、端口
- 跟踪和验证:跟踪、检查
- 清单和设备:地址、清单、MAC 地址表、节点、传感器
- 事件:事件
每个端点都有自己的 API。您可以请求所有数据和所有设备,也可以按给定的主机名过滤请求。每个 API 都返回 API 模型中定义的预定数据集。
Swagger 界面同时显示公共 API 和内部 API。公共 API 的名称中不包含 internal。内部 API 不支持公开使用,如有更改,恕不另行通知。
开始使用
您可以从 Swagger UI 或终端界面访问 API 网关并执行请求。如果您使用的是终端窗口,请继续下一节。
通过在浏览器的地址栏中输入以下内容之一来打开 Swagger 界面
- 云部署:https://api.netq.nvidia.com/swagger/
- 本地部署:https://<hostname-or-ipaddr>/swagger/
- NVIDIA Air:https://api.air.netq.nvidia.com/swagger/
从窗口右上角的“选择定义”下拉列表中选择 *auth*。这将打开授权 API。

登录
虽然您可以查看未经授权的 API 端点,但只有在获得授权后才能执行 API 端点。
您必须首先获取访问密钥,然后使用该密钥授权您访问 API。
- 单击“POST/login”。

- 单击“Try it out”。

- 输入您用于登录 NetQ UI 的用户名和密码。不要更改 `access-key` 值。

单击“Execute”。
向下滚动以查看“响应”。在“服务器响应”部分的 200 代码响应的响应正文中,复制顶行的访问令牌。

- 单击“Authorize”。

将访问密钥粘贴到“值”字段中,然后单击“Authorize”。
单击“Close”。
登录并获取授权
打开终端窗口。
登录以获取访问令牌。您将需要以下信息
- API 网关的主机名或 IP 地址以及端口(云部署为 443,本地部署为 32708)
- 作为 NetQ 安装过程一部分提供的登录凭据。对于此版本,默认用户名为 *admin*,密码为 *admin*。
此示例使用 IP 地址 192.168.0.10、端口 443 和默认凭据
<computer-name>:~ <username>$ curl -X POST "https://api.192.168.0.10.netq.nvidia.com:443/netq/auth/v1/login" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"username\": \"admin\", \"password\": \"admin\", \"access_key\": \"string\"}"
输出将访问令牌作为第一个参数提供。
{"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9....","customer_id":0,"expires_at":1597200346504,"id":"admin","is_cloud":true,"premises":[{"name":"OPID0","namespace":"NAN","opid":0},{"name":"ea-demo-dc-1","namespace":"ea1","opid":30000},{"name":"ea-demo-dc-2","namespace":"ea1","opid":30001},{"name":"ea-demo-dc-3","namespace":"ea1","opid":30002},{"name":"ea-demo-dc-4","namespace":"ea1","opid":30003},{"name":"ea-demo-dc-5","namespace":"ea1","opid":30004},{"name":"ea-demo-dc-6","namespace":"ea1","opid":30005},{"name":"ea-demo-dc-7","namespace":"ea1","opid":80006},{"name":"Cumulus Data Center","namespace":"NAN","opid":1568962206}],"reset_password":false,"terms_of_use_accepted":true}
将访问令牌复制到文本文件。您将需要此令牌来发出 API 数据请求。
现在您可以针对端点创建和执行 API 请求。
默认情况下,授权有效期为 24 小时,之后用户必须重新登录并重新授权其帐户。
API 请求
您可以使用 Swagger UI 或带有 `bash` 和 `curl` 命令的终端窗口来创建和执行 API 请求。
从应用程序右上角的定义下拉列表中选择端点。
此示例显示已选择 BGP 端点

选择端点对象。
此示例显示选择 GET bgp 对象的结果

单击“Try it out”。
输入所需参数的值。
单击“Execute”。
在终端窗口中,使用 `bash` 加 `curl` 执行请求。每个请求都包含一个 API 方法(GET、POST 等)、要查询的地址和 API 端点对象、各种标头,有时还包含正文。例如,在上面的登录步骤中
- API 方法 = POST
- 地址和 API 对象 = “https://<netq.domain>:443/netq/auth/v1/login”
- 标头 = -H “accept: application/json” 和 -H “Content-Type: application/json”
- 正文 = -d “{ "username": "admin", "password": "admin", "access_key": "string"}”
API 响应
NetQ API 响应包括状态代码、任何相关的错误代码(如果失败)以及收集的数据(如果成功)。
以下 HTTP 状态代码可能会在 API 响应中显示
代码 | 名称 | 描述 | 操作 |
---|---|---|---|
200 | 成功 | 请求已成功处理。 | 查看响应。 |
400 | 错误请求 | 在请求中检测到无效输入。 | 检查请求的语法,并确保它与架构匹配。 |
401 | 未经授权 | 身份验证失败或未提供凭据。 | 提供或验证您的凭据,或向管理员请求访问权限。 |
403 | 已禁止 | 请求有效,但用户可能没有所需的权限。 | 验证您的凭据或向管理员请求帐户。 |
404 | 未找到 | 找不到请求的资源。 | 稍等片刻后重试请求,或验证资源状态。 |
409 | 冲突 | 由于资源当前状态冲突,无法处理请求。 | 验证资源状态并消除冲突。 |
500 | 内部服务器错误 | 发生意外情况。 | 执行常规故障排除并重试请求。 |
503 | 服务不可用 | 请求的服务当前不可用。 | 验证 NetQ 平台或设备以及关联服务的状态。 |
请求和响应示例
此处显示了一些命令请求及其响应,但您可以随意运行自己的请求。要运行请求,您将需要您的授权令牌。使用 `curl` 命令时,响应已通过 python 工具进行管道传输,以使其更具可读性。您也可以选择这样做。
验证 BGP 服务的全网络状态
向 *bgp* 端点发出请求,以验证在运行该服务的所有节点上 BGP 服务的运行情况。
- 打开检查端点。

- 打开检查对象。

单击“Try it out”。
输入 `time`、`duration`、`by` 和 `proto` 参数的值。
在此示例中,time=1597256560,duration=24,by=scheduled,proto=bgp。
单击“Execute”,然后向下滚动以查看“服务器响应”下的结果。

运行以下 `curl` 命令,输入各种参数的值。在此示例中,*time=1597256560*,*duration=24*(小时),*by=scheduled*,*proto=bgp*。
curl -X GET "<https://<netq.domain>:<port>/netq/telemetry/v1/object/check?time=1597256560&duration=24&by=scheduled&proto=bgp" -H "accept: application/json" -H "Authorization: <auth-token> " | python -m json.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 22869 100 22869 0 0 34235 0 --:--:-- --:--:-- --:--:-- 34183
{
"count": 24,
"data": [
{
"additional_summary": {
"failed_sessions": 0,
"total_sessions": 0
},
"failed_node_set": [],
"jobid": "c5c046d1-3cc5-4c8b-b4e8-cf2bbfb050e6",
"res_timestamp": 1597254743280,
"rotten_node_set": [],
"summary": {
"checkedNodeCount": 0,
"failedNodeCount": 0,
"failedSessionCount": 0,
"rottenNodeCount": 0,
"totalNodeCount": 0,
"totalSessionCount": 0,
"warningNodeCount": 0
},
...
获取特定交换机上 EVPN 的状态
向 *evpn/hostname* 端点发出请求,以查看在该节点上运行的所有 EVPN 会话的状态。
此示例使用 *server01* 交换机。
- 打开 EVPN 端点。

- 打开主机名对象。

单击“Try it out”。
输入 `hostname` 的值,以及 `eq_timestamp`、`count` 和 `offset` 参数的可选值。
在此示例中,time=1597256560,duration=24,by=scheduled,proto=bgp。
单击“Execute”,然后向下滚动以查看“服务器响应”下的结果。

此示例在本地网络部署中使用 *server01* 交换机。
curl -X GET "https://<netq.domain>:32708/netq/telemetry/v1/object/evpn/hostname/spine01" -H "accept: application/json" -H "Authorization: <auth-token>" | python -m json.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2 0 2 0 0 3 0 --:--:-- --:--:-- --:--:-- 3
[]
<!-- old output -->
[
{
"import_rt": "[\"197:42\"]",
"vni": 42,
"rd": "27.0.0.22:2",
"hostname": "server01",
"timestamp": 1556037403853,
"adv_all_vni": true,
"export_rt": "[\"197:42\"]",
"db_state": "Update",
"in_kernel": true,
"adv_gw_ip": "Disabled",
"origin_ip": "27.0.0.22",
"opid": 0,
"is_l3": false
},
{
"import_rt": "[\"197:37\"]",
"vni": 37,
"rd": "27.0.0.22:8",
"hostname": "server01",
"timestamp": 1556037403811,
"adv_all_vni": true,
"export_rt": "[\"197:37\"]",
"db_state": "Update",
"in_kernel": true,
"adv_gw_ip": "Disabled",
"origin_ip": "27.0.0.22",
"opid": 0,
"is_l3": false
},
{
"import_rt": "[\"197:4001\"]",
"vni": 4001,
"rd": "6.0.0.194:5",
"hostname": "server01",
"timestamp": 1556036360169,
"adv_all_vni": true,
"export_rt": "[\"197:4001\"]",
"db_state": "Refresh",
"in_kernel": true,
"adv_gw_ip": "Disabled",
"origin_ip": "27.0.0.22",
"opid": 0,
"is_l3": true
},
...
获取给定时间所有接口的状态
向 *interfaces* 端点发出请求,以查看所有接口的状态。通过指定 *eq-timestamp* 选项并以 epoch 格式输入日期和时间,您可以指示该时间的数据(与默认情况下过去一小时的数据相反),如下所示
curl -X GET "https://<netq.domain>:32708/netq/telemetry/v1/object/interface?eq_timestamp=1556046250" -H "Content-Type: application/json" -H "Authorization: <auth-token>" | python -m json.tool
[
{
"hostname": "exit-1",
"timestamp": 1556046270494,
"state": "up",
"vrf": "DataVrf1082",
"last_changed": 1556037405259,
"ifname": "swp3.4",
"opid": 0,
"details": "MTU: 9202",
"type": "vlan"
},
{
"hostname": "exit-1",
"timestamp": 1556046270496,
"state": "up",
"vrf": "DataVrf1081",
"last_changed": 1556037405320,
"ifname": "swp7.3",
"opid": 0,
"details": "MTU: 9202",
"type": "vlan"
},
{
"hostname": "exit-1",
"timestamp": 1556046270497,
"state": "up",
"vrf": "DataVrf1080",
"last_changed": 1556037405310,
"ifname": "swp7.2",
"opid": 0,
"details": "MTU: 9202",
"type": "vlan"
},
{
"hostname": "exit-1",
"timestamp": 1556046270499,
"state": "up",
"vrf": "",
"last_changed": 1556037405315,
"ifname": "DataVrf1081",
"opid": 0,
"details": "table: 1081, MTU: 65536, Members: swp7.3, DataVrf1081, swp4.3, swp6.3, swp5.3, swp3.3, ",
"type": "vrf"
},
...
获取正在监控的所有设备的列表
向 *inventory* 端点发出请求,以获取所有受监控节点及其配置信息的列表,如下所示
curl -X GET "https://<netq.domain>:32708/netq/telemetry/v1/object/inventory" -H "Content-Type: application/json" -H "Authorization: <auth-token>" | python -m json.tool
[
{
"hostname": "border01",
"timestamp": 1556037425658,
"asic_model": "A-Z",
"agent_version": "3.2.0-cl4u30~1601403318.104fb9ed",
"os_version": "A.2.0",
"disk_total_size": "10 GB",
"os_version_id": "A.2.0",
"platform_model": "A_VX",
"memory_size": "2048.00 MB",
"asic_vendor": "AA Inc",
"cpu_model": "A-SUBLEQ",
"asic_model_id": "N/A",
"platform_vendor": "A Systems",
"asic_ports": "N/A",
"cpu_arch": "x86_64",
"cpu_nos": "2",
"platform_mfg_date": "N/A",
"platform_label_revision": "N/A",
"agent_state": "fresh",
"cpu_max_freq": "N/A",
"platform_part_number": "3.7.6",
"asic_core_bw": "N/A",
"os_vendor": "CL",
"platform_base_mac": "00:01:00:00:01:00",
"platform_serial_number": "00:01:00:00:01:00"
},
{
"hostname": "exit-2",
"timestamp": 1556037432361,
"asic_model": "C-Z",
"agent_version": "3.2.0-cl4u30~1601403318.104fb9ed",
"os_version": "C.2.0",
"disk_total_size": "30 GB",
"os_version_id": "C.2.0",
"platform_model": "C_VX",
"memory_size": "2048.00 MB",
"asic_vendor": "CC Inc",
"cpu_model": "C-CRAY",
"asic_model_id": "N/A",
"platform_vendor": "C Systems",
"asic_ports": "N/A",
"cpu_arch": "x86_64",
"cpu_nos": "2",
"platform_mfg_date": "N/A",
"platform_label_revision": "N/A",
"agent_state": "fresh",
"cpu_max_freq": "N/A",
"platform_part_number": "3.7.6",
"asic_core_bw": "N/A",
"os_vendor": "CL",
"platform_base_mac": "00:01:00:00:02:00",
"platform_serial_number": "00:01:00:00:02:00"
},
{
"hostname": "firewall-1",
"timestamp": 1556037438002,
"asic_model": "N/A",
"agent_version": "2.1.0-ub16.04u15~1555608012.1d98892",
"os_version": "16.04.1 LTS (Xenial Xerus)",
"disk_total_size": "3.20 GB",
"os_version_id": "(hydra-poc-01 /tmp/purna/Kleen-Gui1/)\"16.04",
"platform_model": "N/A",
"memory_size": "4096.00 MB",
"asic_vendor": "N/A",
"cpu_model": "QEMU Virtual version 2.2.0",
"asic_model_id": "N/A",
"platform_vendor": "N/A",
"asic_ports": "N/A",
"cpu_arch": "x86_64",
"cpu_nos": "2",
"platform_mfg_date": "N/A",
"platform_label_revision": "N/A",
"agent_state": "fresh",
"cpu_max_freq": "N/A",
"platform_part_number": "N/A",
"asic_core_bw": "N/A",
"os_vendor": "Ubuntu",
"platform_base_mac": "N/A",
"platform_serial_number": "N/A"
},
...