0

When using the Python swiftclient module I can POST to an object with a header of X-Delete-At/After and an epoch, but how do I show the expiration time of the object? I was doing some testing and it seems that the file is always being expired immediately, e.g. where I set the time for 100 days in the future:

>>> swift.put_object('container1','test_file01.txt','This is line 1 in the file test_file01.txt done at: %s' % datetime.now().strftime('%Y-%m-%d %H:%M:%S,%f'))
'4b3faf0b79d97f5e478949e7d6c4c575'
>>> swift.head_object('container1','test_file01.txt')
{'content-length': '78', 'server': 'Jetty(7.6.4.v20120524)', 'last-modified': 'Wed, 23 Apr 2014 17:09:55 GMT', 'etag': '4b3faf0b79d97f5e478949e7d6c4c575', 'x-timestamp': '1398272995', 'date': 'Wed, 23 Apr 2014 17:09:59 GMT', 'content-type': 'application/octet-stream'}
>>> swift.post_object('container1','test_file01.txt',headers={'X-Delete-At':(datetime.now(pytz.timezone('GMT')) + timedelta(days=100)).strftime('%s')})
>>> swift.head_object('container1','test_file01.txt')

Traceback (most recent call last):
  File "<pyshell#121>", line 1, in <module>
    swift.head_object('container1','test_file01.txt')
  File "/usr/local/lib/python2.7/dist-packages/swiftclient/client.py", line 1279, in head_object
    return self._retry(None, head_object, container, obj)
  File "/usr/local/lib/python2.7/dist-packages/swiftclient/client.py", line 1189, in _retry
    rv = func(self.url, self.token, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/swiftclient/client.py", line 853, in head_object
    http_response_content=body)
ClientException: Object HEAD failed: http://10.249.238.135:9024:9024/v1/rjm-vnx-namespace01/container1/test_file01.txt 404 Not Found

So it seems it was expired immediately. My questions are:

  1. Am I setting the expiration correctly? I would like to be able to do it to an existing object rather than at object creation time, but perhaps I HAVE to do it when it's being created???
  2. Is there a way to see the expiration time? Obviously if it's not working correctly than there's no good way to see it, but if it were, does head_object() return that information?

Thanks,

Rob

Rob Marshall
  • 599
  • 1
  • 4
  • 11

1 Answers1

0

Never mind, I figured it out. By setting an "after" I realized that the value apparently needs to be in milliseconds. So when I changed it to:

>>> swift.post_object('container1','test_file01.txt',headers={'X-Delete-At':int((datetime.now(pytz.timezone('GMT')) + timedelta(days=100)).strftime('%s'))*1000})
>>> swift.head_object('container1','test_file01.txt')
{'content-length': '78', 'x-delete-at':'1406932148000', 'server': 'Jetty(7.6.4.v20120524)', 'last-modified': 'Wed, 23 Apr 2014 17:29:06 GMT', 'etag': '0baf8b37f374c94e59a05a7f7b339811', 'x-timestamp': '1398274146', 'date': 'Wed, 23 Apr 2014 17:29:08 GMT', 'content-type': 'application/octet-stream'}

Then it worked as expected.

Rob

Rob Marshall
  • 599
  • 1
  • 4
  • 11