Developer Blog

Simulate SymLinks on Rackspace Cloud Files

Rackspace cloud files which is based on Openstack Swift provides reliable & fast, object storage and you can read more about the product here

In Cloud Files, there is no inbuilt way to do aliases or multiple names to the same object. However, after some documentation trolling and speaking to some of our Cloud Files engineers, there is a way to achieve it, although it is not straightforward.<!-- more -->

Cloud Files offers large file (over 5G) support by allowing multiple segments to be uploaded and then a manifest that links the segments. This is well explained is this blog post

We can leverage the same feature to achieve symlinking/aliasing. To begin with get an auth token

curl -D - \
  -H "X-Auth-Key: <replace with your api key>" \
  -H "X-Auth-User: <replace with your username>" \

Results will be along these lines

HTTP/1.1 204 No Content
Server: nginx/0.8.55
Date: Sat, 24 Aug 2013 14:12:13 GMT
Connection: keep-alive
X-Storage-Token: <storage token>
X-Storage-Url: <returned storage URL>
X-Server-Management-Url: <returned server management URL>
X-CDN-Management-Url: <returned CDN management URL>
X-Auth-Token: <auth token used for subsequent requests>
vary: Accept, Accept-Encoding, X-Auth-Token, X-Auth-Key, X-Storage-User, X-Storage-Pass, X-Auth-User
Cache-Control: s-maxage=85963
VIA: 1.0 Repose (Repose/2.3.5)
Front-End-Https: on

Now let's create a test file which we will use for the symlink.

echo 'Analys(z)e  This !! :)' >adata.txt

We now upload this file to a Cloud Files container named 'examples' using the storage URL returned above.

curl -X PUT -H 'X-Auth-Token: <auth token from above>' \
<storage URL from above>/examples/adata.txt --data-binary '@adata.txt'

Now we use our friendly X-Object-Manifest header to create the links we want. Create a link for analyse.txt. In this case we pass an empty input to --data-binary

curl -X PUT -H 'X-Auth-Token: <auth token from above>' \
-H 'X-Object-Manifest: examples/adata.txt' \
<storage URL from above>/examples/analyse.txt --data-binary ''

Then create a link for analyze.txt

curl -X PUT -H 'X-Auth-Token: <auth token from above>' \
-H 'X-Object-Manifest: examples/adata.txt' \
-H 'Content-Type: text/plain; charset=UTF-8' \
<storage URL from above>/examples/analyze.txt --data-binary ''

Test with curl

Analys(z)e  This !! :)

Analys(z)e  This !! :)

We have effectively created a symlink to another object inside the cloud files container.

If you are using CDN, you likely have more friendly URLS and they will work the same

curl <Friendly CDN URL>/analyse.txt
curl <Friendly CDN URL>/analyze.txt

While this may seem like bit of a workaround, functionality wise, this will work the same as any other object storage operation in Cloud Files.


Racker Powered