Hi,

I'd like to propose the addition of block-level storage volume management
in LibCloud. In the two environments that I'm familiar with (Amazon EC2 EBS and
Cloudstack volumes), the way of working is very similar, with the main
operations being:
    - create storage volume
    - attach storage volume to node
    - detach storage volume to node
    - destroy storage volume

There is currently an closed out-of-date JIRA issue dealing with this issue:
https://issues.apache.org/jira/browse/LIBCLOUD-35. I would propose to use the
general interface outlined in this issue as a starting point, as shown below.

As I'm only familiar with two of the providers that are supported by LibCloud,
and only in a limited way with both of them, I think it would be very useful
to have feedback on the interface outlined below, as well as common use cases
for which this interface may not fit.

I've already added a portion of the interface below to the Cloudstack driver
(https://issues.apache.org/jira/browse/LIBCLOUD-208), and would be happy to
work further on this as well as possibly doing the implementation for EC2 EBS.

Any comments or suggestions would be very welcome.

- Gabriel

#------------------------------------------------------------------------------

class StorageVolume(object):
    """
    A base StorageVolume class to derive from.
    """

    def __init__(self, id, size, driver, extra=None):
        self.id = id
        self.size = size
        self.driver = driver
        self.extra = extra


# The following methods could be added to libcloud.compute.base.NodeDriver:

    def create_volume(**kwargs):
        """Create a new volume."""

        @keyword    size: Size of volume in gigabytes (required)
        @type       size: C{int}

        @keyword    name: Name of the volume to be created
        @type       name: C{str}

        @keyword    location: Which data center to create a volume in. If empty,
                              undefined behavoir will be selected. (optional)
        @type       location: L{NodeLocation}

        @keyword    snapshot:  Name of snapshot from which to create the new
                               volume.  (optional)
        @type       snapshot:   C{str}

        @return: The newly created L{StorageVolume}.
        """
        raise NotImplementedError(
            'create_volume not implemented for this driver')


    def destroy_volume(self, volume):
        """Destroys a storage volume

        @param      volume: Volume to be destroyed
        @type       volume: L{StorageVolume}

        @return: C{bool}
        """

        raise NotImplementedError(
                'destroy_volume not implemented for this driver')


    def attach(self, node, volume, device):
        """Attaches volume to node

        @param      node: Node to attach volume to
        @type       node: L{Node}

        @param      volume: Volume to attach
        @type       volume: L{StorageVolume}

        @param      device: Where the device is exposed e.g., (/dev/sdb)
        @type       device: string

        @return: C{bool}
        """
        raise NotImplementedError('attach not implemented for this driver')


    def detach(self, node, volume):
        """Detaches a volume from a node

        @param      node: Node from which the volume is to be detached
        @type       node: L{Node}

        @param      volume: Volume to be detached
        @type       volume: L{StorageVolume}

        @returns C{bool}
        """

        raise NotImplementedError('detach not implemented for this driver')

Reply via email to