Connecting to a local swift all-in-one with Apache libcloud

Apache libcloud is a great tool for connecting to cloud storage providers like Amazon S3, Google cloud or Openstack swift. Openstack swift provides an installation option called swift all-in-one to set up swift in a virtual machine for doing Swift development.

This is what we need to do to connect to a local swift all-in-one server with Apache libcloud:

requirements.txt:

apache-libcloud==0.20.1  
python-swiftclient==2.7.0  
import os

import swiftclient.client as client

from libcloud.storage.types import Provider  
from libcloud.storage.providers import get_driver

USER = 'test:tester'  
PASS = 'testing'  
AUTH_URL = 'http://ip-of-swift-vm:8080/auth/v1.0'


def connect(username, password, authurl):  
    STORAGE_URL, AUTH_TOKEN = client.get_auth(
        auth_url=AUTH_URL, user=USER, key=PASS)
    cls = get_driver(Provider.OPENSTACK_SWIFT)
    driver = cls(USER, PASS,
                 ex_force_auth_token=AUTH_TOKEN,
                 ex_force_base_url=STORAGE_URL,
                 secure=False)
    return driver

Now the rest (uploading, downloading objects) is just the same!

# connect to swift
driver = connect(USER,PASS,AUTH_URL)

# To create container
driver.create_container('download')  
# To get a container
container=driver.get_container('download')


# To upload an object
def upload_object(driver, container, file_path, extra={}):  
    with open(file_path, 'rb') as f:
        obj = driver.upload_object_via_stream(iterator=f,
                                              container=container,
                                              object_name=os.path.basename(
                                                  file_path),
                                              extra=extra)

upload_object(driver,  
              container, 
              '/path/to/file', 
              extra={'somekey':'some meta value'})

# To download an object
def download_object(driver, container, object, ouptut_path):  
    obj = driver.get_object(container_name=container.name, 
                            object_name=object.name)
    filename = os.path.basename(obj.name)
    path = os.path.join(ouptut_path,filename)
    object.download(destination_path=path)

object=container.get_object('hello.txt')  
download_object(driver,container,object,/output/path/')  

Moinul Hossain

Read more posts by this author.