API 特别兴趣小组/当前设计/链接
< API 特别兴趣小组 | 当前设计(重定向自 API 工作组/当前设计/链接)
目录
分析
OpenStack API 中如何引用链接
当前设计
Cinder
Cinder 似乎对所有嵌入式链接引用使用 JSON Hyper-Schema [1] 风格。
示例
GET /
{
"versions": [
{
"status": "CURRENT",
"updated": "2012-01-04T11:33:21Z",
"id": "v1.0",
"links": [
{
"href": "http://23.253.228.211:8776/v1/",
"rel": "self"
}
]
},
{
"status": "CURRENT",
"updated": "2012-11-21T11:33:21Z",
"id": "v2.0",
"links": [
{
"href": "http://23.253.228.211:8776/v2/",
"rel": "self"
}
]
}
]
}
GET /v2/{tenant_id}/volumes
{
"volumes": [
{
"id": "45baf976-c20a-4894-a7c3-c94b7376bf55",
"links": [
{
"href": "https://:8776/v2/0c2eba2c5af04d3f9e9d0d410b371fde/volumes/45baf976-c20a-4894-a7c3-c94b7376bf55",
"rel": "self"
},
{
"href": "https://:8776/0c2eba2c5af04d3f9e9d0d410b371fde/volumes/45baf976-c20a-4894-a7c3-c94b7376bf55",
"rel": "bookmark"
}
],
"name": "vol-004"
},
{
"id": "5aa119a8-d25b-45a7-8d1b-88e127885635",
"links": [
{
"href": "https://:8776/v2/0c2eba2c5af04d3f9e9d0d410b371fde/volumes/5aa119a8-d25b-45a7-8d1b-88e127885635",
"rel": "self"
},
{
"href": "https://:8776/0c2eba2c5af04d3f9e9d0d410b371fde/volumes/5aa119a8-d25b-45a7-8d1b-88e127885635",
"rel": "bookmark"
}
],
"name": "vol-003"
}
]
}
Glance
Glance 对其主页使用 JSON Hyper-Schema [1] 风格的引用。
在大多数其他请求和响应中,glance 一致地使用键 "self"、"file"、"schema" 和 "first" 来记录相对 URL。这些字段似乎不使用带有协议和主机名的完全限定 URL。
示例
GET /
{
"versions": [
{
"status": "CURRENT",
"id": "v2.2",
"links": [
{
"href": "http://23.253.228.211:9292/v2/",
"rel": "self"
}
]
},
{
"status": "SUPPORTED",
"id": "v2.1",
"links": [
{
"href": "http://23.253.228.211:9292/v2/",
"rel": "self"
}
]
},
{
"status": "SUPPORTED",
"id": "v2.0",
"links": [
{
"href": "http://23.253.228.211:9292/v2/",
"rel": "self"
}
]
},
{
"status": "SUPPORTED",
"id": "v1.1",
"links": [
{
"href": "http://23.253.228.211:9292/v1/",
"rel": "self"
}
]
},
{
"status": "SUPPORTED",
"id": "v1.0",
"links": [
{
"href": "http://23.253.228.211:9292/v1/",
"rel": "self"
}
]
}
]
}
GET /v2/images
{
"images": [
{
"status": "active",
"name": "cirros-0.3.2-x86_64-disk",
"tags": [],
"container_format": "bare",
"created_at": "2014-11-07T17:07:06Z",
"disk_format": "qcow2",
"updated_at": "2014-11-07T17:19:09Z",
"visibility": "public",
"self": "/v2/images/1bea47ed-f6a9-463b-b423-14b9cca9ad27",
"min_disk": 0,
"protected": false,
"id": "1bea47ed-f6a9-463b-b423-14b9cca9ad27",
"file": "/v2/images/1bea47ed-f6a9-463b-b423-14b9cca9ad27/file",
"checksum": "64d7c1cd2b6f60c92c14662941cb7913",
"owner": "5ef70662f8b34079a6eddb8da9d75fe8",
"size": 13167616,
"min_ram": 0,
"schema": "/v2/schemas/image",
"virtual_size": null
},
{
"status": "active",
"name": "F17-x86_64-cfntools",
"tags": [],
"container_format": "bare",
"created_at": "2014-10-30T08:23:39Z",
"disk_format": "qcow2",
"updated_at": "2014-11-03T16:40:10Z",
"visibility": "public",
"self": "/v2/images/781b3762-9469-4cec-b58d-3349e5de4e9c",
"min_disk": 0,
"protected": false,
"id": "781b3762-9469-4cec-b58d-3349e5de4e9c",
"file": "/v2/images/781b3762-9469-4cec-b58d-3349e5de4e9c/file",
"checksum": "afab0f79bac770d61d24b4d0560b5f70",
"owner": "5ef70662f8b34079a6eddb8da9d75fe8",
"size": 476704768,
"min_ram": 0,
"schema": "/v2/schemas/image",
"virtual_size": null
}
],
"schema": "/v2/schemas/images",
"first": "/v2/images"
}
Keystone
Keystone 对其返回的一些链接使用 JSON Hyper-Schema [1] 风格的引用。
在一些请求和响应中,使用关键字 "self" 来引用资源链接,这些链接出现在类似于 JSON Hyper-Schema 风格的 "links" 字典中。这些 "links" 字典也可能包含 "next" 和 "previous" 链接。
还有一些响应使用 "self" 关键字和 "url" 关键字。"url" 键似乎既出现在请求中,也出现在响应中。
大多数调用似乎使用包装在 "links" 字典中的 "self" 关键字,如下所示
{
"links": {
"self": "http://spam:eggs/bacon"
}
}
示例
GET /v3
{
"version": {
"id": "v3.4",
"links": [
{
"href": "https://:35357/v3/",
"rel": "self"
}
],
"media-types": [
{
"base": "application/json",
"type": "application/vnd.openstack.identity-v3+json"
}
],
"status": "stable",
"updated": "2015-03-30T00:00:00Z"
}
}
GET /v3/auth/tokens
{
"token": {
"expires_at": "2013-02-27T18:30:59.999999Z",
"issued_at": "2013-02-27T16:30:59.999999Z",
"methods": [
"password"
],
"user": {
"domain": {
"id": "1789d1",
"links": {
"self": "http://identity:35357/v3/domains/1789d1"
},
"name": "example.com"
},
"id": "0ca8f6",
"links": {
"self": "http://identity:35357/v3/users/0ca8f6"
},
"name": "Joe"
}
}
}
POST /v3/services
{
"service": {
"type": "volume"
}
}
{
"service": {
"enabled": true,
"id": "686766",
"links": {
"self": "http://identity:5000/v3/services/686766"
},
"type": "volume"
}
}
POST /v3/endpoints
{
"endpoint": {
"interface": "public",
"name": "name",
"region_id": "north",
"url": "http://identity:35357/v3/endpoints/828384",
"service_id": "686766"
}
}
{
"endpoint": {
"id": "828384",
"interface": "internal",
"links": {
"self": "http://identity:35357/v3/endpoints/828384"
},
"name": "the internal volume endpoint",
"region_id": "north",
"service_id": "686766",
"url": "http://identity:35357/v3/endpoints/828384"
}
}
GET /v3/services
{
"links": {
"next": null,
"previous": null,
"self": "http://identity:5000/v3/services"
},
"services": [
{
"description": "Keystone Identity Service",
"enabled": true,
"id": "686766",
"links": {
"self": "http://identity:5000/v3/services/686766"
},
"name": "keystone",
"type": "identity"
},
{
"enabled": true,
"id": "936521",
"links": {
"self": "http://identity:5000/v3/services/936521"
},
"type": "volume"
}
]
}
Neutron
Neutron 对返回的响应使用 JSON Hyper-Schema [1]。除了其主页和版本页面外,neutron 不在其响应中返回嵌入式链接。
示例
GET /
{
"versions": [
{
"status": "CURRENT",
"id": "v2.0",
"links": [
{
"href": "http://23.253.228.211:9696/v2.0",
"rel": "self"
}
]
}
]
}
Nova
Nova 似乎对大多数返回的响应使用 JSON Hyper-Schema [1]。
有一些响应使用 "url" 键来描述链接,尚不清楚这些链接是否仅用于外部资源。
还有一些调用允许值 "imageRef" 和 "flavorRef" 接受传入的链接。
示例
GET /
{
"versions": [
{
"id": "v2.0",
"links": [
{
"href": "http://openstack.example.com/v2/",
"rel": "self"
}
],
"status": "SUPPORTED",
"version": "",
"min_version": "",
"updated": "2011-01-21T11:33:21Z"
},
{
"id": "v2.1",
"links": [
{
"href": "http://openstack.example.com/v2.1/",
"rel": "self"
}
],
"status": "CURRENT",
"version": "2.3",
"min_version": "2.1",
"updated": "2013-07-23T11:33:21Z"
}
]
}
POST /v2.1/{tenant_id}/os-agents
{
"agent": {
"hypervisor": "hypervisor",
"os": "os",
"architecture": "x86",
"version": "8.0",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"url": "http://example.com/path/to/resource"
}
}
{
"agent": {
"agent_id": 1,
"architecture": "x86",
"hypervisor": "hypervisor",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"os": "os",
"url": "http://example.com/path/to/resource",
"version": "8.0"
}
}
POST /v2.1/{tenant_id}/servers
{
"server": {
"name": "new-server-test",
"imageRef": "http://openstack.example.com/openstack/images/70a599e0-31e7-49b7-b260-868f441e862b",
"flavorRef": "http://openstack.example.com/openstack/flavors/1",
"metadata": {
"My Server Name": "Apache1"
},
"min_count": "2",
"max_count": "3"
}
}
{
"server": {
"adminPass": "wfksH3GTTseP",
"id": "440cf918-3ee0-4143-b289-f63e1d2000e6",
"links": [
{
"href": "http://openstack.example.com/v2.1/servers/440cf918-3ee0-4143-b289-f63e1d2000e6",
"rel": "self"
},
{
"href": "http://openstack.example.com/servers/440cf918-3ee0-4143-b289-f63e1d2000e6",
"rel": "bookmark"
}
]
}
}