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/')