将 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 网关并执行请求。如果您使用的是终端窗口,请继续下一节。

  1. 通过在浏览器的地址栏中输入以下内容之一来打开 Swagger 界面

  2. 从窗口右上角的“选择定义”下拉列表中选择 *auth*。这将打开授权 API。

登录

虽然您可以查看未经授权的 API 端点,但只有在获得授权后才能执行 API 端点。

您必须首先获取访问密钥,然后使用该密钥授权您访问 API。

  1. 单击“POST/login”。
  1. 单击“Try it out”。
  1. 输入您用于登录 NetQ UI 的用户名和密码。不要更改 `access-key` 值。
  1. 单击“Execute”。

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

  1. 单击“Authorize”。
  1. 将访问密钥粘贴到“”字段中,然后单击“Authorize”。

  2. 单击“Close”。

登录并获取授权

  1. 打开终端窗口。

  2. 登录以获取访问令牌。您将需要以下信息

    • 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}
    
  3. 将访问令牌复制到文本文件。您将需要此令牌来发出 API 数据请求。

现在您可以针对端点创建和执行 API 请求。

默认情况下,授权有效期为 24 小时,之后用户必须重新登录并重新授权其帐户。

API 请求

您可以使用 Swagger UI 或带有 `bash` 和 `curl` 命令的终端窗口来创建和执行 API 请求。

  1. 从应用程序右上角的定义下拉列表中选择端点。

    此示例显示已选择 BGP 端点

  1. 选择端点对象。

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

为每个对象和可以指定的各种参数提供说明。在“响应”部分中,您可以看到请求成功时返回的数据。
  1. 单击“Try it out”。

  2. 输入所需参数的值。

  3. 单击“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 服务的运行情况。

  1. 打开检查端点。
  1. 打开检查对象。
  1. 单击“Try it out”。

  2. 输入 `time`、`duration`、`by` 和 `proto` 参数的值。

    在此示例中,time=1597256560,duration=24,by=scheduled,proto=bgp。

  3. 单击“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* 交换机。

  1. 打开 EVPN 端点。
  1. 打开主机名对象。
  1. 单击“Try it out”。

  2. 输入 `hostname` 的值,以及 `eq_timestamp`、`count` 和 `offset` 参数的可选值。

    在此示例中,time=1597256560,duration=24,by=scheduled,proto=bgp。

  3. 单击“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"
  },
...