使用 Glance 的元数据定义目录公共 API

Glance 服务托管的一个通用 API,供供应商、管理员、服务和用户有意义地定义可用的键/值对和标签元数据。其目的是为了在 OpenStack 用户的人工制品、服务和项目之间实现更好的元数据协作。

这涉及不同类型资源(镜像、人工制品、卷、风味、聚合等)上可使用的可用元数据的定义。定义包括属性类型、其键、描述和约束。此目录不会存储特定实例属性的值。

例如,虚拟 CPU 拓扑属性(核心数)的定义将包括要使用的键、描述以及值约束,例如要求它是一个整数。因此,用户可以通过 Horizon 等方式搜索此目录,以列出可以添加到风味或镜像的可用属性。他们将在列表中看到虚拟 CPU 拓扑属性,并知道它必须是一个整数。在 Horizon 示例中,当用户添加属性时,其键和值将存储在拥有该资源的服务中(Nova 用于风味,Glance 用于镜像)。

图表: https://wiki.openstack.org/w/images/b/bb/Glance-Metadata-API.png

Glance 元数据定义目录的实现始于 API 版本 v2。

身份验证

Glance 依赖于 Keystone 和 OpenStack Identity API 来处理客户端的身份验证。您必须从 Keystone 获取身份验证令牌,并通过 X-Auth-Token 标头将其与所有 API 请求一起发送到 Glance。Glance 将与 Keystone 通信以验证令牌的有效性并获取您的身份凭据。

有关与 Keystone 集成的更多信息,请参阅 使用 Keystone 进行身份验证

使用 v2.X

为了便于举例说明,假设 Glance API 服务器正在 URL http://glance.openstack.example.org 上的默认端口 80 运行。

列出可用命名空间

我们想要查看经过身份验证的用户可以访问的可用命名空间列表。这包括用户拥有的命名空间、与用户共享的命名空间和公共命名空间。

我们向 http://glance.openstack.example.org/v2/metadefs/namespaces 发送 GET 请求,以检索此可用命名空间列表。数据以以下格式的 JSON 编码映射返回

{
  "namespaces": [
      {
          "namespace": "MyNamespace",
          "display_name": "My User Friendly Namespace",
          "description": "My description",
          "visibility": "public",
          "protected": true,
          "owner": "The Test Owner",
          "self": "/v2/metadefs/namespaces/MyNamespace",
          "schema": "/v2/schemas/metadefs/namespace",
          "created_at": "2014-08-28T17:13:06Z",
          "updated_at": "2014-08-28T17:13:06Z",
          "resource_type_associations": [
              {
                  "name": "OS::Nova::Aggregate",
                  "created_at": "2014-08-28T17:13:06Z",
                  "updated_at": "2014-08-28T17:13:06Z"
              },
              {
                  "name": "OS::Nova::Flavor",
                  "prefix": "aggregate_instance_extra_specs:",
                  "created_at": "2014-08-28T17:13:06Z",
                  "updated_at": "2014-08-28T17:13:06Z"
              }
          ]
      }
  ],
  "first": "/v2/metadefs/namespaces?sort_key=created_at&sort_dir=asc",
  "schema": "/v2/schemas/metadefs/namespaces"
}

注意

列出命名空间只会显示每个命名空间的摘要,包括计数和资源类型关联。包含其所有对象定义、属性定义等的详细响应仅在每个单独的 GET 命名空间请求上可用。

过滤命名空间列表

GET /v2/metadefs/namespaces 请求接受查询参数,这些参数用于过滤返回的命名空间列表。以下列表详细介绍了这些查询参数。

  • resource_types=RESOURCE_TYPES

    过滤具有 resource_types 的命名空间,该命名空间位于逗号分隔的 RESOURCE_TYPES 列表中。

GET 资源还接受其他查询参数

  • sort_key=KEY

    结果将按指定的排序属性 KEY 排序。允许的值包括 namespacecreated_at(默认)和 updated_at

  • sort_dir=DIR

    结果将按方向 DIR 排序。允许的值是 asc(升序)或 desc(降序,默认)。

  • marker=NAMESPACE

    可以指定命名空间标识符标记。如果存在,则仅列出在标识符 NAMESPACE 之后的命名空间,即在 sort_dir 方向上晚于该标记 NAMESPACEsort_key 的命名空间。

  • limit=LIMIT

    如果存在,则返回的结果的最大数量将不超过 LIMIT

注意

如果指定的 LIMIT 超过操作员定义的限制(api_limit_max),则返回的结果数量可能少于 LIMIT

  • visibility=PUBLIC

    管理员用户可以使用 visibility 参数来控制返回哪些结果(PRIVATE 或 PUBLIC)。

检索命名空间

我们想要查看经过身份验证的用户可以访问的命名空间的更多详细信息。详细信息包括属性、对象和资源类型关联。

我们向 http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace} 发送 GET 请求,以检索命名空间详细信息。数据以以下格式的 JSON 编码映射返回

{
  "namespace": "MyNamespace",
  "display_name": "My User Friendly Namespace",
  "description": "My description",
  "visibility": "public",
  "protected": true,
  "owner": "The Test Owner",
  "schema": "/v2/schemas/metadefs/namespace",
  "resource_type_associations": [
      {
          "name": "OS::Glance::Image",
          "prefix": "hw_",
          "created_at": "2014-08-28T17:13:06Z",
          "updated_at": "2014-08-28T17:13:06Z"
      },
      {
          "name": "OS::Cinder::Volume",
          "prefix": "hw_",
          "properties_target": "image",
          "created_at": "2014-08-28T17:13:06Z",
          "updated_at": "2014-08-28T17:13:06Z"
      },
      {
          "name": "OS::Nova::Flavor",
          "prefix": "filter1:",
          "created_at": "2014-08-28T17:13:06Z",
          "updated_at": "2014-08-28T17:13:06Z"
      }
  ],
  "properties": {
      "nsprop1": {
          "title": "My namespace property1",
          "description": "More info here",
          "type": "boolean",
          "default": true
      },
      "nsprop2": {
          "title": "My namespace property2",
          "description": "More info here",
          "type": "string",
          "default": "value1"
      }
  },
  "objects": [
      {
          "name": "object1",
          "description": "my-description",
          "self": "/v2/metadefs/namespaces/MyNamespace/objects/object1",
          "schema": "/v2/schemas/metadefs/object",
          "created_at": "2014-08-28T17:13:06Z",
          "updated_at": "2014-08-28T17:13:06Z",
          "required": [],
          "properties": {
              "prop1": {
                  "title": "My object1 property1",
                  "description": "More info here",
                  "type": "array",
                  "items": {
                      "type": "string"
                  }
              }
          }
      },
      {
          "name": "object2",
          "description": "my-description",
          "self": "/v2/metadefs/namespaces/MyNamespace/objects/object2",
          "schema": "/v2/schemas/metadefs/object",
          "created_at": "2014-08-28T17:13:06Z",
          "updated_at": "2014-08-28T17:13:06Z",
          "properties": {
              "prop1": {
                  "title": "My object2 property1",
                  "description": "More info here",
                  "type": "integer",
                  "default": 20
              }
          }
      }
  ]
}

检索可用资源类型

我们想要查看 Glance 中所有可用的资源类型列表

我们向 http://glance.openstack.example.org/v2/metadefs/resource_types 发送 GET 请求,以检索所有资源类型。

数据以以下格式的 JSON 编码映射返回

{
  "resource_types": [
      {
          "created_at": "2014-08-28T17:13:04Z",
          "name": "OS::Glance::Image",
          "updated_at": "2014-08-28T17:13:04Z"
      },
      {
          "created_at": "2014-08-28T17:13:04Z",
          "name": "OS::Cinder::Volume",
          "updated_at": "2014-08-28T17:13:04Z"
      },
      {
          "created_at": "2014-08-28T17:13:04Z",
          "name": "OS::Nova::Flavor",
          "updated_at": "2014-08-28T17:13:04Z"
      },
      {
          "created_at": "2014-08-28T17:13:04Z",
          "name": "OS::Nova::Aggregate",
          "updated_at": "2014-08-28T17:13:04Z"
      },
      {
          "created_at": "2014-08-28T17:13:04Z",
          "name": "OS::Nova::Server",
          "updated_at": "2014-08-28T17:13:04Z"
      }
  ]
}

检索与命名空间关联的资源类型

我们想要查看与特定命名空间关联的资源类型列表

我们向 http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace}/resource_types 发送 GET 请求,以检索资源类型。

数据以以下格式的 JSON 编码映射返回

{
  "resource_type_associations" : [
      {
         "name" : "OS::Glance::Image",
         "prefix" : "hw_",
         "created_at": "2014-08-28T17:13:04Z",
         "updated_at": "2014-08-28T17:13:04Z"
      },
      {
         "name" :"OS::Cinder::Volume",
         "prefix" : "hw_",
         "properties_target" : "image",
         "created_at": "2014-08-28T17:13:04Z",
         "updated_at": "2014-08-28T17:13:04Z"
      },
      {
         "name" : "OS::Nova::Flavor",
         "prefix" : "hw:",
         "created_at": "2014-08-28T17:13:04Z",
         "updated_at": "2014-08-28T17:13:04Z"
      }
  ]
}

添加命名空间

我们想要创建一个新的命名空间,它可以包含属性、对象等。

我们向 Glance 发送 POST 请求以添加命名空间

POST http://glance.openstack.example.org/v2/metadefs/namespaces/

输入数据是以下格式的 JSON 编码映射

{
  "namespace": "MyNamespace",
  "display_name": "My User Friendly Namespace",
  "description": "My description",
  "visibility": "public",
  "protected": true
}

注意

可以选择在相同的输入中添加属性、对象和资源类型关联。请参阅上面的 GET 命名空间输出(输入将类似)。

更新命名空间

我们想要更新现有的命名空间

我们向 Glance 发送 PUT 请求以更新命名空间

PUT http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace}

输入数据与添加命名空间类似

删除命名空间

我们想要删除现有的命名空间,包括其所有对象、属性等。

我们向 Glance 发送 DELETE 请求以删除命名空间

DELETE http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace}

将资源类型与命名空间关联

我们想要将资源类型与现有的命名空间关联

我们向 Glance 发送 POST 请求以关联资源类型

POST http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace}/resource_types

输入数据是以下格式的 JSON 编码映射

{
        "name" :"OS::Cinder::Volume",
        "prefix" : "hw_",
        "properties_target" : "image",
        "created_at": "2014-08-28T17:13:04Z",
        "updated_at": "2014-08-28T17:13:04Z"
}

删除与命名空间关联的资源类型

我们想要将命名空间从资源类型中取消关联

我们向 Glance 发送 DELETE 请求以取消关联命名空间资源类型

DELETE http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace}/resource_types/{resource_type}

列出命名空间中的对象

我们想要查看特定命名空间中的元定义对象列表

我们向 http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace}/objects 发送 GET 请求以检索对象。

数据以以下格式的 JSON 编码映射返回

{
      "objects": [
      {
          "name": "object1",
          "description": "my-description",
          "self": "/v2/metadefs/namespaces/MyNamespace/objects/object1",
          "schema": "/v2/schemas/metadefs/object",
          "created_at": "2014-08-28T17:13:06Z",
          "updated_at": "2014-08-28T17:13:06Z",
          "required": [],
          "properties": {
              "prop1": {
                  "title": "My object1 property1",
                  "description": "More info here",
                  "type": "array",
                  "items": {
                      "type": "string"
                  }
              }
          }
      },
      {
          "name": "object2",
          "description": "my-description",
          "self": "/v2/metadefs/namespaces/MyNamespace/objects/object2",
          "schema": "/v2/schemas/metadefs/object",
          "created_at": "2014-08-28T17:13:06Z",
          "updated_at": "2014-08-28T17:13:06Z",
          "properties": {
              "prop1": {
                  "title": "My object2 property1",
                  "description": "More info here",
                  "type": "integer",
                  "default": 20
              }
          }
      }
  ],
  "schema": "/v2/schemas/metadefs/objects"
}

在特定命名空间中添加对象

我们想要创建一个新的对象,它可以将属性分组

我们向 Glance 发送 POST 请求以将对象添加到命名空间

POST http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace}/objects

输入数据是以下格式的 JSON 编码映射

{
  "name": "StorageQOS",
  "description": "Our available storage QOS.",
  "required": [
      "minIOPS"
  ],
  "properties": {
      "minIOPS": {
          "type": "integer",
          "description": "The minimum IOPs required",
          "default": 100,
          "minimum": 100,
          "maximum": 30000369
      },
      "burstIOPS": {
          "type": "integer",
          "description": "The expected burst IOPs",
          "default": 1000,
          "minimum": 100,
          "maximum": 30000377
      }
  }
}

在特定命名空间中更新对象

我们想要更新现有的对象

我们向 Glance 发送 PUT 请求以更新对象

PUT http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace}/objects/{object_name}

输入数据与添加对象类似

在特定命名空间中删除对象

我们想要删除现有的对象。

我们向 Glance 发送 DELETE 请求以删除命名空间中的对象

DELETE http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace}/objects/{object_name}

在特定命名空间中添加属性定义

我们想要在命名空间中创建一个新的属性定义

我们向 Glance 发送 POST 请求以将属性定义添加到命名空间

POST http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace}/properties

输入数据是以下格式的 JSON 编码映射

{
  "name": "hypervisor_type",
  "title" : "Hypervisor",
  "type": "array",
  "description": "The type of hypervisor required",
  "items": {
      "type": "string",
      "enum": [
          "hyperv",
          "qemu",
          "kvm"
      ]
  }
}

在特定命名空间中更新属性定义

我们想要更新现有的对象

我们向 Glance 发送 PUT 请求以更新命名空间中的属性定义

PUT http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace}/properties/{property_name}

输入数据与添加属性定义类似

在特定命名空间中删除属性定义

我们想要删除现有的对象。

我们向 Glance 发送 DELETE 请求以删除命名空间中的属性定义

DELETE http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace}/properties/{property_name}

API 消息本地化

Glance 支持 HTTP 消息本地化。例如,即使服务器的区域语言是英语,HTTP 客户端也可以接收中文 API 消息。

如何使用

要接收本地化的 API 消息,HTTP 客户端需要指定 Accept-Language 标头,以指示用于翻译消息的语言。有关 Accept-Language 的更多信息,请参阅 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

典型的 curl API 请求如下

curl -i -X GET -H 'Accept-Language: zh' -H 'Content-Type: application/json'
http://glance.openstack.example.org/v2/metadefs/namespaces/{namespace}

然后响应将如下所示

HTTP/1.1 404 Not Found
Content-Length: 234
Content-Type: text/html; charset=UTF-8
X-Openstack-Request-Id: req-54d403a0-064e-4544-8faf-4aeef086f45a
Date: Sat, 22 Feb 2014 06:26:26 GMT

<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>404 Not Found</h1>
&#25214;&#19981;&#21040;&#20219;&#20309;&#20855;&#26377;&#26631;&#35782; aaa &#30340;&#26144;&#20687;<br /><br />
</body>
</html>

注意

请确保目标 Glance 服务器上的 /usr/share/locale-langpack/ 下有语言包。