跳转到: 导航, 搜索

Neutron/APIv2-specification

Neutron v2 API

此页面是一个草案规范,可能不反映实际实现。

请参考 https://developer.openstack.org/api-ref-networking-v2.html 获取最新信息。

概述

Neutron 是一个项目,旨在为 OpenStack 计算服务管理的设备提供虚拟网络服务。本文档介绍了 Neutron API 的 2.0 版本。有关 Neutron 项目的更多信息和附加文档,请访问 https://wiki.openstack.org/Neutron 和 docs.openstack.org。我们欢迎反馈、评论和错误报告,请发送至 https://bugs.launchpad.net/neutron

v2.0 API 代表了 Quantum v1.1 API 与来自 Melange API 的一些最重要的 IPAM 功能的组合。这些 IPAM 功能侧重于能够将地址块和其他网络配置(例如默认网关、dns 服务器)与 Neutron 网络关联,然后能够从该块中分配 IP 地址并将其与通过 Neutron 端口连接到网络的设备关联。

v2.0 API 通过引入一个新的实体,称为子网来实现这一点。子网可以表示绑定到先前创建的 Quantum 网络的 IPv4 或 IPv6 地址块,并且每个 Neutron 网络通常有一个或多个子网。当在网络上创建端口时,默认情况下,将从每个 IP 版本的指定子网中分配一个可用的固定 IP 地址。当端口被销毁时,分配的地址返回到子网上的可用 IP 池。Neutron API 的用户可以选择从块中选择特定的 IP 地址,或者让 Neutron 选择第一个可用的 IP 地址。

请注意,Neutron API 的 1.x 版本已从源代码树中删除。为了使用 v1.x API,应安装 Neutron 的早期版本。

高级流程

  • 租户创建一个网络(例如,“net1”)
  • 租户创建一个子网(例如,“10.0.0.0/24”),这隐式地将地址空间与该网络关联。这种关联创建了地址空间到先前创建的网络之间的绑定。虽然通常说子网由 IPv4 或 IPv6 地址范围表示,但仅地址范围本身不是子网。相反,是将地址空间绑定到网络,从而创建了子网。
  • 租户启动一个 VM,指定一个连接到“net1”的单个 NIC(例如:nova boot --image <image_name> --nic net-id=<id_of_net1> <server_name>)
  • Nova 联系 Neutron 并创建 net1 上的 port1。
  • Neutron 为 port1 分配 IP。 (IP 由 Neutron 选择)
  • 租户销毁 VM。
  • Nova 联系 Neutron 并销毁 port1。分配的 IP 返回到可用 IP 池。

插件

Neutron API 代表了虚拟网络服务与用户和其他服务的接口。这些网络服务由一个称为“插件”的组件实现。插件可以采用不同的技术和技术来为租户提供隔离的虚拟网络,以及提供其他服务,例如 IP 地址管理。用户不应关心所使用的特定插件,只要与本文档中讨论的 API 保持一致,因为每个插件都将实现 Neutron v2 API 中包含的所有操作。

但是,某些插件可能会通过 API 扩展公开其他功能,稍后在本文档中讨论。有关特定插件公开的扩展的更多信息,请参阅插件文档。

概念

Neutron v2 API 管理三种类型的实体

  • 网络,代表隔离的虚拟 Layer-2 域;网络也可以被视为虚拟(或逻辑)交换机;
  • 子网,代表 IPv4 或 IPv6 地址块,可用于为连接到给定网络的虚拟机分配 IP 地址。
  • 端口,代表给定网络上的虚拟(或逻辑)交换机端口。

所有实体,在本章的其余部分中详细讨论,都支持使用 POST/GET/PUT/DELETE 动词的基本 CRUD 操作,并具有自动生成唯一的标识符。

网络

网络是一个虚拟隔离的 Layer-2 广播域,通常保留给创建它的租户,除非网络已明确配置为共享。租户可以创建多个网络,直到达到由基于租户的配额指定的阈值(有关更多详细信息,请参阅下一章)。网络是 Neutron API 的主要实体。端口和子网必须始终与网络关联。下表描述了网络对象的属性。对于每个属性,CRUD 列应按如下方式读取

  • C - 该属性可用于创建操作;
  • R - 该属性在显示列出操作的响应中返回;
  • U - 可以更新属性的值;
  • D - 可以删除属性的值;
属性 类型 必需 CRUD 默认值 验证约束
id uuid-str 不适用 CR 生成 UUID_PATTERN
name 字符串 CRU 不适用
admin_state_up 布尔值 CRU { 真 | 假 }
status 字符串 不适用 R 不适用 不适用
子网 list(uuid-str) R 空列表 不适用
shared 布尔值 CRU { 真 | 假 }
tenant_id uuid-str 否* CR 不适用 不适用

子网

子网代表一个 IP 地址块,可用于为虚拟机分配 IP 地址。每个子网必须具有 CIDR 并且必须与网络关联。IP 可以从整个子网 CIDR 中选择,也可以从用户可以指定的“分配池”中选择。

子网还可以选择性地具有网关、DNS 名称服务器列表和主机路由。所有这些信息都将推送到与子网关联的接口的实例。

属性 类型 必需 CRUD 默认 验证约束
id uuid-str 不适用 CR 生成 UUID_PATTERN
name 字符串 CRU 不适用
network_id uuid-str Yes CR 生成 现有的网络标识符。
ip_version 整数 Yes CR 4 { 4 | 6 }
cidr 字符串 Yes CR 不适用 形式为 <network_address>/<prefix> 的有效 CIDR
gateway_ip 字符串或 null CRUD CIDR 中的第一个地址 有效的 IP 地址或 null
dns_nameservers list(str) CRU 每个子网可配置的最大名称服务器数量。默认值为 5。
allocation_pools list(dict) CR CIDR 中所有地址,不包括配置的gateway IP(如果已配置) 范围的开始/结束必须是有效的 IP
host_routes list(dict) CRU 默认路由到 gateway_ip {'destination': <CIDR>, "nexthop": <有效的 IP 地址>}. 每个子网可配置的最大路由数量。默认值为 20。
enable_dhcp 布尔值 CRU { 真 | 假 }
tenant_id uuid-str 否* CR 不适用 不适用

端口

端口代表给定逻辑网络交换机上的虚拟交换机端口。虚拟机将其接口连接到端口。逻辑端口还定义了连接到端口的接口的 MAC 地址和 IP 地址(地址)。当将 IP 地址与端口关联时,这也意味着该端口与子网关联,因为 IP 地址是从特定子网的分配池中获取的。

属性 类型 必需 CRUD 默认 验证约束
id uuid-str 不适用 CR 生成 UUID_PATTERN
name 字符串 CRU 不适用
network_id uuid-str Yes CR 不适用 现有的网络标识符。
admin_state_up 布尔值 CRU { 真 | 假 }
status 字符串 不适用 R 不适用 不适用
mac_address 字符串 CR 生成 6 字节形式的有效 MAC 地址,用冒号分隔。
fixed_ips list(dict) CRU 自动从池中分配。 有效的 IP 地址和现有的子网标识符。
device_id str CRUD 无约束
device_owner str CRUD 无约束
tenant_id uuid-str 否* CR 不适用 不适用

* 如果 Neutron 未与 Keystone Identity 服务一起运行,则 tenant_id 属性是必需的

通用 API 信息

身份验证和授权

Neutron 使用 Keystone 身份服务 (http://keystone.openstack.org) 作为默认身份验证服务。当启用 keystone 时,提交请求到 Neutron 服务的用户必须在 X-Auth-Token 请求标头中提供身份验证令牌。上述令牌应通过使用 Keystone 端点进行身份验证来获取。有关使用 Keystone 进行身份验证的更多信息,请参阅 Keystone 文档。当启用 keystone 时,在创建请求中指定 tenant_id 不是必需的,因为租户标识符将从身份验证令牌派生。请注意,默认授权设置仅允许管理用户代表其他租户创建资源。

Neutron 使用从 Keystone 接收到的信息来授权用户请求。Neutron 处理两种类型的授权策略

  • 基于操作:指定特定操作的访问标准的策略,可以对特定属性进行细粒度控制
  • 基于资源:是否根据为资源配置的权限授予对特定资源的访问权限(当前仅适用于网络资源)

Neutron 中实施的实际授权策略可能因部署而异。

请求和响应类型

OpenStack Neutron API 支持 JSON 数据格式。请求和响应的格式可以通过使用 Accept 标头或在请求 URI 中添加 .json 扩展名来指定。

示例:带有标头的请求/响应:JSON

请求


POST /v1.0/tenants/tenantX/networks HTTP/1.1
Host 127.0.0.1:9696
Content-Type application/json
Accept application/json
Content-Length 57

{
 "network":
    {
      "name": "net-name",
      "admin_state_up": true
    }
}

响应


HTTP/1.1 200 Accepted
Content-Type application/json
Content-Length 204

{
 "network":
    {
     "status": "ACTIVE",
     "subnets": [],
     "name": "net-name",
     "admin_state_up": true,
     "tenant_id": "388a70781bae4ca895f17b7f6293eb70",
     "shared": false, "id": "2a4017ef-31ff-496a-9294-e96ecc3bc9c9"
    }
}

注意:我们仍需最终确定有关 XML 支持的决定。 Quantum v2 API XML 蓝图

过滤和列选择

Neutron API 支持基于资源所有顶级属性进行过滤。过滤器适用于所有列出请求。例如


GET /v2.0/networks?name=foobar

将返回所有名称为 foobar 的网络。当指定多个过滤器时,Neutron API 将仅返回满足所有过滤器的对象,从而在过滤器之间应用 AND 条件。Neutron 不提供 OR 过滤器的机制。为此,用户可以为每个过滤器提交不同的请求,然后从接收到的响应中在客户端构建集合。

默认情况下,Neutron 在任何 Show 或 List 调用中返回所有属性。Neutron API 具有一种机制来限制返回的属性集(例如,仅返回“id”)。Neutron API 返回的属性可以使用 fields 查询参数控制。例如,以下请求


GET /v2.0/networks.json?fields=id&fields=name

将仅返回每个网络的idname

同步与异步插件行为

Neutron API 呈现虚拟网络连接性的逻辑模型,包括网络、端口和子网。由 Neutron 插件负责与底层基础设施通信,以确保数据包转发与逻辑模型一致。插件可以异步执行这些操作。这意味着当 API 客户端使用 HTTP POST、PUT 或 DELETE 修改逻辑模型时,API 调用可能在插件对底层虚拟和/或物理交换设备进行任何修改之前返回。API 客户端的唯一保证是,所有后续 API 调用都将正确反映更改后的逻辑模型。例如,考虑客户端使用 HTTP PUT 设置端口的附件的情况。一旦 HTTP 调用返回,发送到接口中命名的附件中的数据包不一定会立即转发。但是,保证后续 HTTP GET 以查看该端口上的附件将返回新的附件值。“status”属性,适用于网络端口资源,可用于了解 Neutron 插件是否已成功完成感兴趣资源的配置。

批量创建操作

Neutron API 允许在同一个 API 请求中创建相同类型的多个对象。批量创建操作使用与单个创建操作完全相同的 API,唯一的区别在于请求主体中指定的是对象列表,而不是单个对象。

批量操作始终以原子方式执行,这意味着请求主体中的所有对象都将创建,或者不创建任何对象。如果特定的插件不支持原子操作,Neutron API 将模拟原子行为,从而确保用户可以期望相同的行为,而与后端运行的特定插件无关。

Neutron 可能被部署而不支持批量操作。在这种情况下,当客户端尝试批量创建操作时,将返回400 Bad Request错误。

有关如何将批量请求提交到 Neutron API 的更多详细信息,请参阅下一章中讨论的创建操作。

配额

[待定] Yong 将贡献

通知

[待定] Yong 将贡献

扩展

Neutron API 是可扩展的。扩展服务于多种目的

  • 它们允许在不更改 API 版本的情况下引入新功能;
  • 它们允许引入供应商特定的利基功能
  • 它们充当未来 API 版本中可能包含的实验功能的试验场。

应用程序可以通过对 v2.0/extensions URI 执行 GET 来以编程方式确定可用的扩展。扩展也可以通过其唯一的别名通过执行 GET 到 /v2.0/extensions/alias_name 进行查询。这是检查扩展是否可用最简单的方法,因为不可用的扩展将发出 itemNotFound (404) 响应。现有的核心 API 资源可以通过新的操作或额外的属性进行扩展。此外,还可以将新资源作为扩展添加。扩展通常具有标签,以防止与其他定义具有相同名称的属性和/或资源的扩展发生冲突,以及与核心资源和属性发生冲突。由于扩展可能不受所有插件支持,因此扩展的可用性会因部署和使用的特定插件而异。

错误

如果处理请求时发生故障,Neutron API 将返回错误响应。Neutron 仅使用标准的 HTTP 错误代码。4xx 错误表示客户端发送的特定请求中存在问题。

错误
4>|400 Bad Request
2>|404 Not Found
3>|409 Conflict
2>|400 Bad Request
500 服务器内部错误
503 ServiceUnavailable

向 Neutron API 发送请求的用户也可能收到以下错误

  • 401 未授权 - 如果提供的凭据无效
  • 403 禁止 - 如果用户无法访问特定资源或执行请求的操作。

API 操作

列出网络

动词 URI
GET /networks

此操作返回租户有权访问的所有网络的列表。这包括租户拥有的网络和共享网络。默认情况下,网络对象将返回其所有属性。用户可以使用field 查询参数控制应返回哪些属性。可以通过在查询字符串上指定搜索条件来过滤响应。目前仅支持完全匹配。

正常响应代码:200

错误响应代码:未授权 (401),错误请求 (400)

JSON 请求和响应示例:

请求


GET /v2.0/networks
Accept: application/json

响应


{
  "networks": [
  {
    "status": "ACTIVE",
    "subnets": [],
    "name": "network_1",
    "admin_state_up": true,
    "tenant_id": "c1210485b2424d48804aad5d39c61b8f",
    "id": "3a06dfc7-d239-4aad-9a57-21cd171c72e5",
    "shared": false
  },
  {
    "status": "ACTIVE",
    "subnets": [],
    "name": "network-2",
    "admin_state_up": true,
    "tenant_id": "c1210485b2424d48804aad5d39c61b8f",
    "id": "7db8c5a4-6eb0-478d-856b-7cfda2b25e13",
    "shared": false
  },
  {
    "status": "ACTIVE",
    "subnets": ["e12f0c45-46e3-446a-b207-9474b27687a6"],
    "name": "network_3",
    "admin_state_up": true,
    "tenant_id": "ed680f49ff714162ab3612d7876ffce5",
    "id": "afc75773-640e-403c-9fff-62ba98db1f19",
    "shared": true
   }
 ]
}

显示网络

动词 URI
GET /networks/<network_id>

此操作返回请求 URI 中指定的网络的完整属性列表,假设网络存在并且发出请求的用户有权访问它。可以通过 field 查询参数控制 API 实际返回的属性集。

正常响应代码:200

错误响应代码:未授权 (401),错误请求 (400),未找到 (404)

JSON 请求和响应示例:

请求


GET /v2.0/networks/afc75773-640e-403c-9fff-62ba98db1f19
Accept: application/json

响应


{
  "network":
  {
    "status": "ACTIVE",
    "subnets": ["e12f0c45-46e3-446a-b207-9474b27687a6"],
    "name": "network_3",
    "admin_state_up": true,
    "shared": false,
    "tenant_id": "ed680f49ff714162ab3612d7876ffce5",
    "id": "afc75773-640e-403c-9fff-62ba98db1f19"
  }
}

创建网络

动词 URI
POST /networks

此操作将创建一个新的 Neutron 网络。新创建网络的标识符在响应中返回。shared 属性可用于创建公共网络,即:与所有其他租户共享的网络。但是,Neutron API 的当前模型仅允许完全私有或完全开放的网络。未来 API 版本将提供更复杂的机制来指定网络上的 ACL。

此外,shared 属性的控制权可以保留给特定的用户,例如管理员。在这种情况下,尝试创建共享网络的普通用户将收到 403 - 禁止 错误。

正常响应代码:200

错误响应代码:未授权 (401),错误请求 (400)

JSON 请求和响应示例:

请求


POST v2.0/networks.json
Content-Type: application/json
Accept: application/json

{
 "network":
  {
    "name": "sample_network",
    "admin_state_up": false
  }
}

响应


'status': '201'
'content-length': '194'
'content-type': 'application/json;

{
  "network":
    {
      "status": "ACTIVE",
      "subnets": [],
      "name": "sample_network",
      "admin_state_up": false,
      "shared": false,
      "tenant_id": "c1210485b2424d48804aad5d39c61b8f",
       "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766"
     }
}

批量版本

该操作的批量版本允许使用单个请求创建多个网络。批量创建操作的行为始终是原子性的:请求体中的所有网络都创建成功,或者都不创建。为此,必须在请求体中提供一个网络列表,如下所示

JSON 请求和响应示例:

请求


POST v2.0/networks.json

Content-Type: application/json
Accept: application/json

{
"networks": [
   {
     "name": "sample_network_1",
     "admin_state_up": false
   },
   {
     "name": "sample_network_2",
     "admin_state_up": false
   }]
}

更新网络

动词 URI
PUT /networks/<network-id>

更新网络操作允许用户更新网络对象的某些属性,例如名称和 admin_state_up。诸如 tenant_id 之类的属性无法更新。如果尝试更新这些属性,将返回 422 'Unprocesable Entity' 错误。

有权控制 shared 属性的用户也允许更改它。虽然共享以前的私有网络始终是可能的,但反之则并非总是如此。如果用户尝试将具有属于不同于网络所有者的租户的子网和/或端口的共享网络变为私有,将返回 409 冲突 错误。

注意:Neutron 中的更新操作采用补丁语义。这意味着 Neutron API 不需要用户发送要更新的整个资源,而只需发送用户希望更新的属性,如以下示例所示。

正常响应代码:200 确定

错误响应代码:400 错误请求,401 未授权,403 禁止,404 未找到

JSON 请求和响应示例:

请求


PUT /v2.0/networks/fc68ea2c-b60b-4b4f-bd82-94ec81110766.json

Content-Type: application/json
Accept: application/json

{
  "network":
    {
      "name": "updated_name"
    }
}

响应


status: 200
content-length: 192
content-type: application/json

{
  "network":
    {"status": "ACTIVE",
     "subnets": [],
     "name": "updated_name",
     "admin_state_up": false,
     "shared": false,
      "tenant_id": "c1210485b2424d48804aad5d39c61b8f",
      "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766"}}

删除网络

动词 URI
DELETE /networks/<network_id>

JSON 请求和响应示例:

此操作将删除 Neutron 网络及其所有关联的子网,前提是网络上当前未配置任何端口。如果端口仍然配置在要删除的网络上,将返回 409 错误。

正常响应代码:204

错误响应代码:400 错误请求,401 未授权,403 禁止,404 未找到,409 网络正在使用。

请求


DELETE /v2.0/networks/fc68ea2c-b60b-4b4f-bd82-94ec81110766

Content-Type: application/json
Accept: application/json

响应


status: 204

列出子网

动词 URI
GET /subnets

此操作将返回租户有权访问的子网对象列表。默认策略设置将仅返回提交请求的租户拥有的子网,除非请求由具有管理权限的用户提交。用户可以使用 fields 查询参数控制应返回哪些属性,如前一章所述。此外,可以使用查询字符串参数过滤结果,如前一章所述。

此操作不需要请求体。

正常响应代码:200 确定

错误响应代码:401 未授权

JSON 请求和响应示例:

请求


GET v2.0/subnets.json

Accept: application/json

响应


status: 200
content-length: 607
content-type: application/json

{
  "subnets": [
   {
     "name": "",
     "network_id": "ed2e3c10-2e43-4297-9006-2863a2d1abbc",
     "tenant_id": "c1210485b2424d48804aad5d39c61b8f",
     "allocation_pools": [{"start": "10.10.0.2", "end": "10.10.0.254"}],
     "gateway_ip": "10.10.0.1",
     "ip_version": 4,
     "cidr": "10.10.0.0/24",
     "id": "4156c7a5-e8c4-4aff-a6e1-8f3c7bc83861",
     "enable_dhcp": true
    },
    {
      "name": "",
      "network_id": "afc75773-640e-403c-9fff-62ba98db1f19",
      "tenant_id": "ed680f49ff714162ab3612d7876ffce5",
      "allocation_pools": [{"start": "10.0.0.2", "end": "10.0.0.254"}],
      "gateway_ip": "10.0.0.1",
      "ip_version": 4,
      "cidr": "10.0.0.0/24",
      "id": "e12f0c45-46e3-446a-b207-9474b27687a6",
      "enable_dhcp": true
     }]
}

显示子网

动词 URI
GET /subnets/<subnet-id>

此操作返回请求 URI 中指定的子网的数据。用户可以使用 fields 查询参数控制应返回哪些属性,如前一章所述。如果提交请求的用户无权访问请求的子网,或者请求的子网不存在,将返回 404 错误。

此操作不需要请求主体。

正常响应代码:200 确定

错误响应代码:400 错误请求,401 未授权,404 未找到

JSON 请求和响应示例:

请求


GET /v2.0/subnets/4156c7a5-e8c4-4aff-a6e1-8f3c7bc83861

Accept: application/json

响应


status: 200
content-length: 309
content-type: application/json

{
  "subnet":
    {
     "name": "",
     "network_id": "ed2e3c10-2e43-4297-9006-2863a2d1abbc",
     "tenant_id": "c1210485b2424d48804aad5d39c61b8f",
     "allocation_pools": [{"start": "10.10.0.2", "end": "10.10.0.254"}],
     "gateway_ip": "10.10.0.1",
     "ip_version": 4,
     "cidr": "10.10.0.0/24",
     "id": "4156c7a5-e8c4-4aff-a6e1-8f3c7bc83861",
     "enable_dhcp": false,
    }
}

创建子网

动词 URI
POST /subnets

此操作在特定网络上创建一个新的子网。网络标识符 network_id 是必需的。用户还必须指定子网的 cidr,格式为 <network_address>/<prefix>。其余参数是可选的。

默认情况下,Neutron 创建 IP v4 子网。为了创建 IP v6 子网,用户必须在请求体中将 ip_version 属性的值指定为 6。请注意,Neutron 不会尝试从提供的 CIDR 推断正确的 IP 版本。如果网关地址的参数 gateway_ip 未指定,则 Neutron 将从子网的 cidr 中为子网的网关分配一个地址。为了指定没有网关的子网,用户应在请求体中将 gateway_ip 属性的值指定为 null。如果未指定分配池(属性 allocation_pools),Neutron 将自动分配覆盖 CIDR 中所有 IP 地址的池,不包括为子网网关保留的地址。否则,用户可以显式指定分配池,如下例所示。

最后,子网默认情况下将利用 DHCP 向 VM 分发地址。如果使用不同的策略,例如文件系统 IP 配置注入,则应在 create_subnet 请求中将 enable_dhcp 属性显式设置为 False。

正常响应代码:201 已创建

错误响应代码:400 错误请求,401 未授权,403 禁止,404 未找到

JSON 请求和响应示例:

请求


POST /v2.0/subnets
Content-Type: application/json
Accept: application/json

{
  "subnet": {
    "network_id": "ed2e3c10-2e43-4297-9006-2863a2d1abbc",
    "ip_version": 4,
    "cidr": "10.0.3.0/24",
    "allocation_pools": [{"start": "10.0.3.20", "end": "10.0.3.150"}]
  }
}
}}

Response:
{{{
status: 201,
content-length: 306,
content-type: application/json

{
  "subnet": {
    "name": "",
    "network_id": "ed2e3c10-2e43-4297-9006-2863a2d1abbc",
    "tenant_id": "c1210485b2424d48804aad5d39c61b8f",
    "allocation_pools": [{"start": "10.0.3.20", "end": "10.0.3.150"}],
    "gateway_ip": "10.0.3.1",
    "ip_version": 4,
    "cidr": "10.0.3.0/24",
    "id": "9436e561-47bf-436a-b1f1-fe23a926e031",
    "enable_dhcp": true}
}

批量版本

此操作允许使用单个请求创建多个子网。为此,必须在请求体中提供一个子网列表。该操作的行为始终是原子性的,这意味着要么创建所有子网,要么不创建任何子网。

请求


POST /v2.0/subnets
Content-Type: application/json
Accept: application/json

{
  "subnets": [
    {
      "network_id": "ed2e3c10-2e43-4297-9006-2863a2d1abbc",
      "ip_version": 4,
       "cidr": "10.0.4.0/24",
    }
    {
      "network_id": "ed2e3c10-2e43-4297-9006-2863a2d1abbc",
      "ip_version": 4,
       "cidr": "10.0.5.0/24",
    }
   ]
}

更新子网

动词 URI
PUT /subnets/<subnet-id>

此操作更新有关子网的信息。某些属性,例如 IP 版本 (ip_version)、CIDR (cidr) 和 IP 分配池 ('allocation_pools) 无法更新。尝试更新这些属性将导致 400 错误请求错误。

更新 host_routesdns_nameservers 属性后,无法保证这些更改何时会反映在正在运行的 VM 实例上。Neutron API 的唯一职责是将数据模型与新信息更新。这些信息然后传播到正在运行的 VM 取决于用于向其提供 IP 配置的机制。在 DHCP 的情况下,这将在 VM 发送新的 DHCP 请求时发生,因此很可能在 DHCP 租约到期或 VM 重新启动时发生。

注意:Neutron 中的更新操作采用补丁语义。这意味着 Neutron API 不需要用户发送要更新的整个资源,而只需发送用户希望更新的属性,如以下示例所示

正常响应代码:200 确定

错误响应代码:400 错误请求,401 未授权,403 禁止,404 未找到,400 错误请求

JSON 请求和响应示例:

请求


PUT /v2.0/subnets/9436e561-47bf-436a-b1f1-fe23a926e031

Content-Type: application/json
Accept: application/json

{
  "subnet":
    {
      "gateway_ip": "10.0.3.254",
      "name": "new_name"
    }
}

响应


status: 200
content-length: 316
content-type: application/json

{
  "subnet":
   {
     "name": "new_name",
     "network_id": "ed2e3c10-2e43-4297-9006-2863a2d1abbc",
     "tenant_id": "c1210485b2424d48804aad5d39c61b8f",
     "allocation_pools": [{"start": "10.0.3.20", "end": "10.0.3.150"}],
     "gateway_ip": "10.0.3.254",
     "ip_version": 4,
     "cidr": "10.0.3.0/24",
     "enable_dhcp": true,
     "id": "9436e561-47bf-436a-b1f1-fe23a926e031"
   }
}

删除子网

动词 URI
DELETE /subnets/<subnetid>

此操作从 Neutron 网络中删除一个子网。如果来自要删除的子网的 IP 仍然分配,则该操作将失败。

正常响应代码:204

错误响应代码:400 错误请求,401 未授权,403 禁止,404 未找到,409 冲突

JSON 请求和响应示例:

请求


DELETE /v2.0/subnets/9436e561-47bf-436a-b1f1-fe23a926e031

Accept: application/json

响应


Status: 204

列出端口

动词 URI
GET /ports

此操作将返回租户有权访问的端口对象列表。默认策略设置将仅返回提交请求的租户拥有的子网,除非请求由具有管理权限的用户提交。用户可以使用 fields 查询参数控制应返回哪些属性,如前一章所述。此外,可以使用查询字符串参数过滤结果,如前一章所述。

此操作不需要请求体。

正常响应代码:200

错误响应代码:401 未授权

JSON 请求和响应示例:

请求


GET /v2.0/ports.json HTTP/1.1
accept: application/json

响应


Status: 200
Content-Type: application/json
Content-Length: 805

{
    "ports": [
        {
            "admin_state_up": true,
            "device_id": "257614cc-e178-4c92-9c61-3b28d40eca44",
            "device_owner": "",
            "fixed_ips": [
                {
                    "ip_address": "192.168.111.3",
                    "subnet_id": "22b44fc2-4ffb-4de4-b0f9-69d58b37ae27"
                }
            ],
            "id": "24e6637e-c521-45fc-8b8b-d7331aa3c99f",
            "mac_address": "fa:16:3e:0f:3f:b5",
            "name": "",
            "network_id": "6aeaf34a-c482-4bd3-9dc3-7faf36412f12",
            "status": "ACTIVE",
            "tenant_id": "cf1a5775e766426cb1968766d0191908"
        },
        {
            "admin_state_up": true,
            "device_id": "d266f9de-fe2c-4705-93b3-9da71168c93b",
            "device_owner": "",
            "fixed_ips": [
                {
                    "ip_address": "192.168.111.2",
                    "subnet_id": "22b44fc2-4ffb-4de4-b0f9-69d58b37ae27"
                }
            ],
            "id": "e54dfd9b-ce6e-47f7-af47-1609cfd1cdb0",
            "mac_address": "fa:16:3e:f5:41:7f",
            "name": "",
            "network_id": "6aeaf34a-c482-4bd3-9dc3-7faf36412f12",
            "status": "ACTIVE",
            "tenant_id": "cf1a5775e766426cb1968766d0191908"
        }
    ]
}

显示端口

动词 URI
GET /ports/port-id

此操作将返回请求 URI 中指定的端口的信息。如果端口不存在或者提交请求的用户无权访问它,将返回 404 错误。

正常响应代码:200

错误响应代码:400 错误请求,401 未授权,404 未找到

JSON 请求和响应示例:

请求


GET /v2.0/ports/ebe69f1e-bc26-4db5-bed0-c0afb4afe3db.json
accept: application/json

响应


Status: 200
Content-Type: application/json
Content-Length: 410

{
    "port": {
        "admin_state_up": true,
        "device_id": "d6b4d3a5-c700-476f-b609-1493dd9dadc0",
        "device_owner": "",
        "fixed_ips": [
            {
                "ip_address": "192.168.111.4",
                "subnet_id": "22b44fc2-4ffb-4de4-b0f9-69d58b37ae27"
            }
        ],
        "id": "ebe69f1e-bc26-4db5-bed0-c0afb4afe3db",
        "mac_address": "fa:16:3e:a6:50:c1",
        "name": "port1",
        "network_id": "6aeaf34a-c482-4bd3-9dc3-7faf36412f12",
        "status": "ACTIVE",
        "tenant_id": "cf1a5775e766426cb1968766d0191908"
    }
}

创建端口

动词 URI
POST /ports

此操作创建一个新的 Neutron 端口。请求体中必须指定端口将创建的网络 (network_id 参数)。可选地,用户还可以指定以下参数

  • 端口的符号名称
  • MAC 地址
  • 管理状态(True:Up,False:Down)
  • 固定 IP
    • 仅指定子网 ID,Neutron 会从该子网分配第一个可用 IP 到端口
    • 同时指定子网 ID 和 IP 地址,Neutron 将尝试将指定的地址分配给端口
  • 连接到端口的设备的标识符(例如:VM 标识符)
  • 连接到端口的设备的拥有者的标识符(例如:DHCP 代理标识符)

正常响应代码:201

错误响应代码:400 错误请求,401 未授权,403 禁止,404 未找到,409 冲突

JSON 请求和响应示例:

请求


POST /v2.0/ports.json HTTP/1.1
Content-Length: 158
content-type: application/json
accept: application/json

{
    "port": {
        "admin_state_up": true,
        "device_id": "d6b4d3a5-c700-476f-b609-1493dd9dadc0",
        "name": "port1",
        "network_id": "6aeaf34a-c482-4bd3-9dc3-7faf36412f12"
    }
}

响应


Status: 201
Content-Type: application/json; charset=UTF-8
Content-Length: 410

{
    "port": {
        "admin_state_up": true,
        "device_id": "d6b4d3a5-c700-476f-b609-1493dd9dadc0",
        "device_owner": "",
        "fixed_ips": [
            {
                "ip_address": "192.168.111.4",
                "subnet_id": "22b44fc2-4ffb-4de4-b0f9-69d58b37ae27"
            }
        ],
        "id": "ebe69f1e-bc26-4db5-bed0-c0afb4afe3db",
        "mac_address": "fa:16:3e:a6:50:c1",
        "name": "port1",
        "network_id": "6aeaf34a-c482-4bd3-9dc3-7faf36412f12",
        "status": "ACTIVE",
        "tenant_id": "cf1a5775e766426cb1968766d0191908"
    }
}

批量版本

此操作允许使用单个请求创建多个端口。为此,必须在请求体中提供一个端口列表。Neutron API 始终保证批量操作的原子完成。

批量请求示例


{
    "ports": [
        {
         "admin_state_up": true,
         "device_id": "d6b4d3a5-c700-476f-b609-1493dd9dadc0",
         "name": "port1",
         "network_id": "6aeaf34a-c482-4bd3-9dc3-7faf36412f12"
        },
        {
         "admin_state_up": true,
         "device_id": "d6b4d3a5-c700-476f-b609-1493dd9dadc0",
         "name": "port2",
         "network_id": "2cd34a97-e087-75fb-9904-dd12937009ea"
        }
     ]
}

更新端口

动词 URI
更新 /ports/<port-id>

此操作可用于更新端口的信息,例如符号名称和关联的 IP。当更新端口的 IP 时,先前关联的 IP 将被删除,返回到各自子网的分配池,并替换为请求体中 Update 请求中指定的 IP。换句话说,此操作的行为是当请求体中指定时替换 fixed_ip 属性。如果新的 IP 地址无效(例如:已在使用中),则操作失败并且现有的 IP 地址不会与端口分离。

请注意,API 的唯一职责是将新的 IP 关联信息更新到数据模型。IP 地址实际更新到正在运行的 VM 的方式取决于用于传播 IP 配置的特定机制。在 DHCP 的情况下,这将在 VM 发送新的 DHCP 请求时发生,因此很可能在 DHCP 租约到期或 VM 重新启动时发生。

正常响应代码:200

错误响应代码:400 错误请求,401 未授权,403 禁止,404 未找到,409 冲突

JSON 请求和响应示例:

请求


PUT /v2.0/ports/1d8591f4-7b62-428e-857d-e82a15e5a7f1.json HTTP/1.1
Content-Length: 63
content-type: application/json
accept: application/json

{
    "port": {
        "device_id": "37b4f622-5e17-4dca-bf67-7338c5b7dd63"
    }
}

响应


Status: 200
Content-Type: application/json;
Content-Length: 410

{
    "port": {
        "admin_state_up": true,
        "device_id": "37b4f622-5e17-4dca-bf67-7338c5b7dd63",
        "fixed_ips": [
            {
                "ip_address": "192.168.111.4",
                "subnet_id": "22b44fc2-4ffb-4de4-b0f9-69d58b37ae27"
            }
        ],
        "id": "1d8591f4-7b62-428e-857d-e82a15e5a7f1",
        "mac_address": "fa:16:3e:70:d2:8c",
        "name": "port2",
        "network_id": "6aeaf34a-c482-4bd3-9dc3-7faf36412f12",
        "status": "ACTIVE",
        "tenant_id": "cf1a5775e766426cb1968766d0191908"
    }
}

删除端口

动词 URI
DELETE /ports/<port-id>

此操作从 Neutron 网络中删除一个端口。如果端口关联了 IP 地址,则这些地址将返回到各自子网的分配池。

正常响应代码:204

错误响应代码:401 未授权,403 禁止,404 未找到

JSON 请求和响应示例:

请求


DELETE /v2.0/ports/ebe69f1e-bc26-4db5-bed0-c0afb4afe3db.json
accept: application/json

响应


status: 204