使用jclouds使Swift对象失效

时间:2013-12-10 03:38:25

标签: openstack-swift jclouds

我试图在使用jclouds将我的对象PUT上传到我的Swift环期间设置一个对象到期,以便在指定的日期/时间从Swift中删除对象。

我可以使用cURL手动执行此操作,并将对象转换为具有过期日期的Swift。这会使用 X-Delete-At X-Delete-After 标头。有关这些标题的详细信息,请参阅openstack docs 1openstack docs 2

然而,我没有运气通过jclouds做同样的事情。通过jclouds快速搜索没有出现任何一个X-Delete-标题,所以我的假设是不直接支持,除非在消息有效负载中手动设置这些标题。

澄清一点:这些标头不能设置为对象用户元数据。例如,在对象上设置 X-Delete-At 的用户元数据键将生成 X-Object-Meta-x-delete-at 形式的标题, swift不会将其识别为对象过期。

我试图找出是否有办法将自定义标头添加到HTTP PUT操作(而不是用户元数据)来执行此操作。使用cURL,就像添加:

一样简单

-H "X-Delete-After:60"

to the cURL command for the PUT operation (i.e., expire the object in 60 seconds). I assume the same can be done with jclouds. This is what I have so far:

public String writeToStore(String name, InputStream payload) {

    BlobStore bs = prepareContext().
            getBlobStore();

    Blob b = bs.
            blobBuilder(name).
            // userMetadata(mymeta).
            payload(payload).
            contentType("image/jpeg").
            build();

    // Get current headers
    Multimap<String,String> headers = b.getAllHeaders();
    // Add new header & set expire date to 1 year in the future (seconds since epoch)
    headers.put("X-Delete-At", "1418148027");
    // Set headers including new header just added
    b.setAllHeaders(headers);

    return bs.putBlob(containerName, b);
}

尽管在此处添加了 X-Delete-At 标题,但它似乎没有效果。我没有看到Wireshark捕获数据包中出现 X-Delete-At 标题。

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

jclouds目前不支持这个,但我提出了一个将BlobBuilder.expires映射到X-Delete-At的提交:

https://github.com/jclouds/jclouds/pull/227

您可以在此测试并打开JIRA问题:

https://issues.apache.org/jira/browse/JCLOUDS

谢谢!