1

I have some problem about OpenStack swift object storage. I want to set an expiration for objects. I use openstack4j. My upload object code

public void add(String objectName, InputStream imageStream) {
    OSClientV3 clientV3 = OSFactory.clientFromToken(swiftOS.getToken());
    Map<String, String> metaData = new HashMap<>();
    metaData.put("X-Delete-After", "120");
    ObjectPutOptions objectPutOptions = ObjectPutOptions.create();
    objectPutOptions.metadata(metaData);
    clientV3.objectStorage().objects().put(container, objectName,
            Payloads.create(imageStream), objectPutOptions);
}

But it doesn't work. Then I tried to use swift command line.

swift stat test test-19b8e4d4-1085-490d-b866-97f0ada0d46c

What I get is

               Account: AUTH_01d73f1e49ed4dfd9535c831eed4ccf9
             Container: test
                Object: test-19b8e4d4-1085-490d-b866-97f0ada0d46c
          Content Type: application/octet-stream
        Content Length: 2414
         Last Modified: Wed, 20 Dec 2017 07:58:56 GMT
                  ETag: 1cb55838010ed189c0698b6b5cade3ed
   Meta X-Delete-After: 120
X-Openstack-Request-Id: tx4f1f57ef08e34d9296bfd-005a3a184b
           X-Timestamp: 1513756735.97761
            X-Trans-Id: tx4f1f57ef08e34d9296bfd-005a3a184b
         Accept-Ranges: bytes

When I upload an object by

swift upload test test.jpg -H "X-Delete-After: 120"

and then

swift stat test test.jpg

What I get is

    Account: AUTH_01d73f1e49ed4dfd9535c831eed4ccf9
              Container: test
                 Object: test.jpg
           Content Type: application/octet-stream
         Content Length: 1688
          Last Modified: Wed, 20 Dec 2017 08:03:20 GMT
                   ETag: 8a2d75ff8db40610a52a492abac09d3b
             Meta Mtime: 1513755398.217256
            X-Delete-At: 1513757119
          Accept-Ranges: bytes
            X-Timestamp: 1513756999.02865
             X-Trans-Id: txc016e1aff901450aa934b-005a3a194c
 X-Openstack-Request-Id: txc016e1aff901450aa934b-005a3a194c

It is like openstack document said.

The X-Delete-After header takes an integer number of seconds. 
The proxy server that receives the request will convert this 
header into an X-Delete-At header using its current time plus 
the value given.

But why openstack4j doesn't work?

coldesleon
  • 11
  • 1

2 Answers2

2

Looks like we can use

objectPutOptions.getOptions().put("X-Delete-After", "120");

As the getOptions call returns the headers map straight up.

Jeff
  • 21
  • 2
1

You should use header instead of metadata:

objectPutOptions.header("X-Delete-After", "120");
Trufanov Dmitrii
  • 11
  • 1
  • 1
  • 4
  • objectPutOptions doesn't have this api. I am using openstack4j 3.0.4. Am I using wrong version? – coldesleon Dec 26 '17 at 10:47
  • Excuse me. You are right, we used a modified version where this method was added. It fills the header without adding the prefix "X-Object-Meta-" to it, as the method metadata does. – Trufanov Dmitrii Jan 15 '18 at 09:36