Storlets API v1

Storlets API 是 Swift API 的扩展。在某些情况下,我们直接使用 Swift API。例如,上传 storlet 是使用 Swift 上传到指定的容器完成的。在其他情况下,我们为现有的 Swift 操作添加 storlets 特定的头部。例如,通过在 Swift 下载操作中添加 ‘X-Run-Storlet’ 头部来在下载时调用 storlet。

Storlets 操作

Storlets 存储到名为 ‘storlet’ 的特殊容器中。

注意

Storlets 上传到的容器名称是可配置的。名称 ‘storlet’ 是默认值。

列出所有 Storlets

[GET] /v1/{account}/storlet

响应体包含已上传 storlets 的名称列表。响应的 Content-type 是 (text/plain)。

storlet1.jar
storlet2.jar
storlet3.jar

上传新的 Storlet

您可以根据 storlet 开发人员指南中的说明,用 Java 或 Python 编写 storlet 并将其上传到对象存储。storlet 上传到名为 ‘storlet’ 的容器,因此 url 中出现 ‘/storlet’。storlet 可能依赖于其他现有的库,这些库必须上传到 ‘dependency’ 容器。

注意

同样,名称 ‘dependency’ 也是默认值,可以配置为其他名称。

上传 storlet 时,X-Object-Meta-Storlet-Dependency 头部需要一个值,该值是逗号分隔的依赖项列表。X-Object-Meta-Storlet-Main 头部的主类名参数指定了定义 storlet 的 invoke 方法的类。对于用 Python 编写的 storlets,此参数应以 Python 模块名称为前缀。例如,如果 storlet 文件名为 ‘mystorlet.py’,则类名必须是 ‘mystorlet.<类名>’。X-Object-Meta-Storlet-Language 头部指定了运行 storlet 的语言。值为 “Python” 或 “Java”。X-Object-Meta-Storlet-Interface-Version 头部应提供并设置为 ‘1.0’。虽然目前未使用,但 X-Object-Meta-Storlet-Object-Metadata 头部必须提供并设置为 ‘no’。有关 invoke 方法签名的详细信息,请参阅 Storlets 开发人员手册。请求的 content-type 应设置为 ‘application/octet-stream’。仅在 Python 中,您可以设置 ‘X-Object-Meta-Storlet-Language-Version’ 以选择您的 Python 解释器版本。

[PUT] /v1/{account}/storlet/{storlet_object_name}

对于用 Java 编写的 storlets

'X-Object-Meta-Storlet-Language': 'Java'
'X-Object-Meta-Storlet-Interface-Version': '1.0'
'X-Object-Meta-Storlet-Dependency': dependencies
'X-Object-Meta-Storlet-Object-Metadata': 'no'
'X-Object-Meta-Storlet-Main': {main_class_name}
'X-Auth-Token': {authorization_token}

对于用 Python 编写的 storlets

'X-Object-Meta-Storlet-Language': 'Python'
'X-Object-Meta-Storlet-Language-Version': '3.6'
'X-Object-Meta-Storlet-Interface-Version': '1.0'
'X-Object-Meta-Storlet-Dependency': dependencies
'X-Object-Meta-Storlet-Object-Metadata': 'no'
'X-Object-Meta-Storlet-Main': {module_name.class_name}
'X-Auth-Token': {authorization_token}

依赖项操作

上传新的依赖项

您可以创建并上传自己的库来协助运行 storlet。这些依赖项上传到名为 ‘dependency’ 的特殊容器。对于可执行依赖项(例如编译的 c 程序),必须指定 X-Object-Meta-Storlet-Dependency-Permissions 头部。否则,可以省略该头部。包含依赖项的库的名称(即 dependency_name)进入 URI。请求的 content-type 应设置为 ‘application/octet-stream’。

[PUT] /v1/{account}/dependency/{dependency_object_name}
'X-Object-Meta-Storlet-Dependency-Version': '1'
'X-Object-Meta-Storlet-Dependency-Permissions' : '0755'
'X-Auth-Token': {authorization_token}

Storlets 调用

一旦 storlet 及其依赖项部署完成,storlet 就可以准备调用了。Storlets 可以通过 3 种方式调用

  1. 对象下载时调用。

    在这种情况下,用户获得存储中对象的转换(而不是实际对象)。GET 的一个用例是匿名化,用户可能除非通过某些 storlet 进行匿名化,否则无法访问某些数据。通常,在对象下载时调用 storlet 时,storlet 将在持有对象副本的存储节点上调用。对此规则的例外情况如下所述。

  2. 对象上传时调用。

    在这种情况下,存储在对象存储中的数据是用户上传对象的转换(而不是原始数据或元数据)。一个典型的用例是元数据丰富,Storlet 从上传的数据中提取特定于格式的元数据,并将其作为 Swift 元数据添加。在对象上传时调用 storlet 时,storlet 将在代理节点上调用,然后再进行复制。因此,计算仅发生一次,而不是每个副本一次。

  3. 对象复制时调用。

    在这种情况下,storlet 对对象存储中的数据进行操作,生成一个新对象。一个典型的用例是从现有的 jpg 中提取缩略图。在复制时调用 storlet 的位置(对象节点或代理节点)与下载情况相同。

以下是上述调用的 API 参考。

对象下载时调用 storlet

[GET] /v1/{account}/{container}/{object}

必须提供一个额外的头部(‘X-Run-Storlet’)来告知系统运行 storlet。

'X-Run-Storlet': {storlet_name}
'X-Auth-Token': {authorization_token}

还可以向 storlet 提供参数。有两种方法可以发送参数

  1. 通过 URL 查询字符串。例如:/v1/{account}/{container}/{object}?param1=val1&param2=val2

  2. 通过请求头部。例如

    'X-Storlet-Parameter-1': 'param1:val1'
    'X-Storlet-Parameter-2': 'param2:val2'
    

以 ‘storlet_’ 开头的参数是不允许的。‘storlet_’ 前缀保留供内部系统使用。

要对对象的某个范围调用 storlet,请使用 ‘X-Storlet-Range’ 头部。例如

'X-Storlet-Range': 'bytes=1-6'

‘X-Storlet-Range’ 可以接受 Swift 可以接受的 HTTP ‘Range’ 头部中的任何值,如 <https://developer.openstack.org/api-ref-objectstorage-v1.html> 中所述。不允许同时指定 HTTP ‘Range’ 头部和 ‘X-Run-Storlet’,结果为 ‘400 Bad Request’

注意

如果对象恰好是 SLO,则 storlet 将在整个对象数据上调用。因此,storlet 在代理节点上调用。

可以对多个对象进行 GET 调用来调用 storlet。这是使用 ‘X-Storlet-Extra-Resources’ 头部完成的,该头部可用于指定逗号分隔的对象路径列表,格式为 <container>/<object>。目前,不支持跨帐户的额外资源。在下面的 GET 示例中,多输入 storlet 将获得 3 个对象输入流。

[GET] /v1/AUTH_1234/my_container/myobject_1

'X-Run-Storlet': 'multiinputstorlet-1.0.jar'
'X-Storlet-Extra-Resources': 'my_other_container/my_other_object', 'my_other_other_container/my_other_other_object'
'X-Auth-Token': {authorization_token}

使用 ‘X-Storlet-Extra-Resources’ 时,storlet 在代理节点上调用。

注意

请参阅 multi-input-storlet 源代码,了解编写处理多个输入的 storlet 的方法。

对象上传时调用 storlet

[PUT] /v1/{account}/{container}/{object}

必须提供一个额外的头部(‘X-Run-Storlet’)来告知系统运行 storlet。

'X-Run-Storlet': {storlet_name}
'X-Auth-Token': {authorization_token}

与下载时的调用一样,可以通过 URL 查询字符串或请求头部向 storlet 提供参数。

也可以对多个对象进行 PUT 调用来调用 storlet。这与对象下载期间对多个对象调用 storlet 类似。额外的对象应提前上传到 swift。

[PUT] /v1/AUTH_1234/my_container/myobject_1

'X-Run-Storlet': 'multiinputstorlet-1.0.jar'
'X-Storlet-Extra-Resources': 'my_other_container/my_other_object', 'my_other_other_container/my_other_other_object'
'X-Auth-Token': {authorization_token}

对象复制时调用 storlet

Swift 中的对象复制可以使用 PUT 和 COPY 动词完成,如下所示

[PUT] /v1/{account}/{container}/{object}
  'X-Copy-From': {source container}/{source object}

[COPY] /v1/{account}/{container}/{object}
  'Destination': {dest container}/{dest object}

必须提供一个额外的头部(‘X-Run-Storlet’)来告知系统运行 storlet。

'X-Run-Storlet': {storlet_name}
'X-Auth-Token': {authorization_token}

在 PUT 的情况下,storlet 对出现在 ‘X-Copy-From’ 头部中的对象进行操作,创建出现在请求路径中的对象。在 COPY 的情况下,storlet 对出现在请求路径中的对象进行操作,创建出现在 ‘Destination’ 头部中的对象。

无论使用哪个动词来调用复制,都可以添加 ‘X-Storlet-Extra-Resources’ 头部。因此,例如,可以创建一个对象,它是复制源和额外资源的连接。与下载时的调用一样,使用额外资源时,storlet 在代理节点上调用。

目前,在调用复制时指定以下任何头部将导致 ‘400 Bad Request’
  • ‘X-Copy-From-Account’

  • ‘Destination-Account’

  • ‘X-Fresh-Metadata’

仅在代理服务器上执行 storlet

使用 ‘X-Storlet-Run-On-Proxy’ 头部强制引擎在代理上调用 storlet,例如:

'X-Storlet-Run-On-Proxy': ''

Storlets ACLs

Storlets ACLs 是 Swift 容器读取 acl 的扩展,允许向用户通过 storlet 访问数据。换句话说,除非通过特定的 storlet 进行访问,否则某个用户可能无法访问容器中的对象。设置 storlets ACLs 是使用 POST 动词在容器上完成的,如下所示

[POST] /v1/{account}/{container}
X-Storlet-Container-Read: {user_name}
X-Storlet-Name: {storlet_name}
X-Auth-Token: {authorization_token}
  1. user_name 必须是在 Keystone 中定义的可以检索有效令牌的用户。

  2. storlet_name 是允许通过其访问的 storlet 的名称。此名称

    应与调用 storlet 时指定的名称匹配(请参阅 storlet 调用部分)

  3. authorization_token 是 POST 请求发起者的令牌,必须具有

    设置容器 ACL 的权限

当前,storlet ACL 只能设置为单个用户。可以通过对容器执行 HEAD 请求来将 Storlets ACL 视为任何其他容器读取 ACL。ACL 将显示为 .r:storlets.<用户名>_<storlet名称> 作为 Container-Read-ACL 的一部分。