Skip to main content

Cinder Library allows using storage drivers outside of Cinder.

Project description

https://img.shields.io/pypi/v/cinderlib.svg Documentation Status https://img.shields.io/pypi/pyversions/cinderlib.svg https://img.shields.io/docker/build/akrog/cinderlib.svg https://img.shields.io/docker/automated/akrog/cinderlib.svg https://img.shields.io/:license-apache-blue.svg

Introduction

Cinder Library is a Python library that allows using storage drivers outside of Cinder.

This library is currently in Alpha stage and is primarily intended as a proof of concept at this stage. While some drivers have been manually validated most drivers have not, so there’s a good chance that they could experience issues.

When using this library one should be aware that this is in no way close to the robustness or feature richness that the Cinder project provides, for detailed information on the current limitations please refer to the documentation.

Due to the limited access to Cinder backends and time constraints the list of drivers that have been manually tested are (I’ll try to test more):

  • LVM with LIO

  • Dell EMC XtremIO

  • Dell EMC VMAX

  • Kaminario K2

  • Ceph/RBD

  • NetApp SolidFire

If you try the library with another storage array I would appreciate a note on the library version, Cinder release, and results of your testing.

Features

  • Use a Cinder driver without running a DBMS, Message broker, or Cinder service.

  • Using multiple simultaneous drivers on the same program.

  • Basic operations support:

    • Create volume

    • Delete volume

    • Extend volume

    • Clone volume

    • Create snapshot

    • Delete snapshot

    • Create volume from snapshot

    • Connect volume

    • Disconnect volume

    • Local attach

    • Local detach

    • Validate connector

  • Code should support multiple concurrent connections to a volume, though this has not yet been tested.

  • Metadata persistence plugin:

    • Stateless: Caller stores JSON serialization.

    • Database: Metadata is stored in a database: MySQL, PostgreSQL, SQLite…

    • Custom plugin: Metadata is stored in another metadata storage.

Example

The following example uses CentOS 7 and the Cinder LVM driver, which should be the easiest to setup and test.

First you need to setup your system.

You can either use a container:

$ docker run --name=cinderlib --privileged --net=host \
  -v /etc/iscsi:/etc/iscsi \
  -v /dev:/dev \
  -v /etc/lvm:/etc/lvm \
  -v /var/lock/lvm:/var/lock/lvm \
  -v /lib/modules:/lib/modules \
  -v /run/udev:/run/udev \
  -v /etc/localtime:/etc/localtime \
  -it akrog/cinderlib python

Or install things on baremetal/VM:

$ sudo yum install -y centos-release-openstack-queens
$ test -f  /etc/yum/vars/contentdir || echo centos >/etc/yum/vars/contentdir
$ sudo yum install -y openstack-cinder targetcli python-pip
$ sudo pip install cinderlib
$ sudo dd if=/dev/zero of=cinder-volumes bs=1048576 seek=22527 count=1
$ sudo lodevice=`losetup --show -f ./cinder-volumes`
$ sudo pvcreate $lodevice
$ sudo vgcreate cinder-volumes $lodevice
$ sudo vgscan --cache

Then you need to run python with a passwordless sudo user (required to control LVM and do the attach) and execute:

import cinderlib as cl
from pprint import pprint as pp

# We setup the library to setup the driver configuration when serializing
cl.setup(output_all_backend_info=True)

# Initialize the LVM driver
lvm = cl.Backend(volume_driver='cinder.volume.drivers.lvm.LVMVolumeDriver',
                 volume_group='cinder-volumes',
                 iscsi_protocol='iscsi',
                 iscsi_helper='lioadm',
                 volume_backend_name='lvm_iscsi')

# Show the LVM backend stats
pp(lvm.stats())

# Create a 1GB volume
vol = lvm.create_volume(1, name='lvm-vol')

# Export, initialize, and do a local attach of the volume
attach = vol.attach()

pp('Volume %s attached to %s' % (vol.id, attach.path))

# Snapshot it
snap = vol.create_snapshot('lvm-snap')

# Show the JSON string
pp(vol.jsons)

# Save the whole environment to a file
with open('cinderlib-test.txt', 'w') as f:
    f.write(cl.dumps())

# Exit python
exit()

Now we can check that the logical volume is there, exported, and attached to our system:

# lvdisplay
# targetcli ls
# iscsiadm -m session
# lsblk

And now let’s run a new python interpreter and clean things up:

import cinderlib as cl

# Get the whole environment up
with open('cinderlib-test.txt') as f:
    backends = cl.load(f.read(), save=True)

# Get the volume reference we loaded from file and detach
vol = backends[0].volumes[0]
# Volume no longer knows that the attach is local, so we cannot do
# vol.detach(), but we can get the connection and use it.
conn = vol.connections[0]
# Physically detach the volume from the node
conn.detach()
# Unmap the volume and remove the export
conn.disconnect()

# Get the snapshot and delete it
snap = vol.snapshots[0]
snap.delete()

# Finally delete the volume
vol.delete()

We should confirm that the logical volume is no longer there, there’s nothing exported or attached to our system:

# lvdisplay
# targetcli ls
# iscsiadm -m session
# lsblk

History

0.2.2 (2018-07-24)

  • Features:

    • Use NOS-Brick to setup OS-Brick for non OpenStack usage.

    • Can setup persistence directly to use key-value storage.

    • Support loading objects without configured backend.

    • Support for Cinder Queens, Rocky, and Master

    • Serialization returns a compact string

  • Bug fixes:

    • Workaround for Python 2 getaddrinfo bug

    • Compatibility with requests and requests-kerberos

    • Fix key-value support set_key_value.

    • Fix get_key_value to return KeyValue.

    • Fix loading object without configured backend.

0.2.1 (2018-06-14)

  • Features:

    • Modify fields on connect method.

    • Support setting custom root_helper.

    • Setting default project_id and user_id.

    • Metadata persistence plugin mechanism

    • DB persistence plugin

    • No longer dependent on Cinder’s attach/detach code

    • Add device_attached method to update volume on attaching node

    • Support attaching/detaching RBD volumes

    • Support changing persistence plugin after initialization

    • Add saving and refreshing object’s metadata

    • Add dump, dumps methods

  • Bug fixes:

    • Serialization of non locally attached connections.

    • Accept id field set to None on resource creation.

    • Disabling of sudo command wasn’t working.

    • Fix volume cloning on XtremIO

    • Fix iSCSI detach issue related to privsep

    • Fix wrong size in volume from snapshot

    • Fix name & description inconsistency

    • Set created_at field on creation

    • Connection fields not being set

    • DeviceUnavailable exception

    • Multipath settings after persistence retrieval

    • Fix PyPi package created tests module

    • Fix connector without multipath info

    • Always call create_export and remove_export

    • iSCSI unlinking on disconnect

0.1.0 (2017-11-03)

  • First release on PyPI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cinderlib-0.2.2.tar.gz (73.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cinderlib-0.2.2-py2.py3-none-any.whl (26.2 kB view details)

Uploaded Python 2Python 3

File details

Details for the file cinderlib-0.2.2.tar.gz.

File metadata

  • Download URL: cinderlib-0.2.2.tar.gz
  • Upload date:
  • Size: 73.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: Python-urllib/2.7

File hashes

Hashes for cinderlib-0.2.2.tar.gz
Algorithm Hash digest
SHA256 a45f0ddff310fa003d5a091b820341e14448ed02d41ef417bac171bd787aeb82
MD5 d64162604b5b6e430b1a3f36f55f798c
BLAKE2b-256 be39e3835ccd9d33bb336ed970bcd08933f83e34594d8fe0040c2e08e39a509a

See more details on using hashes here.

File details

Details for the file cinderlib-0.2.2-py2.py3-none-any.whl.

File metadata

  • Download URL: cinderlib-0.2.2-py2.py3-none-any.whl
  • Upload date:
  • Size: 26.2 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: Python-urllib/2.7

File hashes

Hashes for cinderlib-0.2.2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 4a7683893e9b762edb6d380617db34aedadb0a3812afe27e21cc9a29702424d6
MD5 b8547e2e41daba0a580ab9aff1d375f0
BLAKE2b-256 40ab48a30b8204fb67e05d119f60399b0911c6a61bd2db657947d4cf90774652

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page