Skip to content
interface.py 7.42 KiB
Newer Older
Benziane Chakib's avatar
Benziane Chakib committed
'''
This is the base interface to all the Cloud Control Hypervisor libraries.
It defines abstract classes that represent any kind of entity
we could handle with this library.

We call our most basic entity a Host, basicly a couple (Machine, Operating
System)

For instance a Host is whether a Hypervisor or a Virtual Machine, however other
type of hosts could easly be implemented
'''

#TODO: Implements KvmHV methods and KvmVM methods


class Host(object):
    '''
    Base host class:
    A host is an abstraction of any type of machine
    '''
    def get_name(self):
        '''
        Returns the host's name
        '''
        pass

    def get_memory_stats(self):
        '''
        Returns a tuple representing memory usage
        (free, used, total)
        '''
        pass

    def get_status(self):
        '''
        Returns host's status
        '''
        pass

    def get_cpu_stats(self):
        '''
        Returns cpu stats as a tuple representing:
        (nb_cpu, nb_core_per_cpu, cpu_usage)
        '''
        pass

    def get_network_conf(self):
        '''
        Returns network configuration
        '''
        pass

    def get_storage_conf(self):
        '''
        Returns storage configuration
        '''
        pass
Benziane Chakib's avatar
Benziane Chakib committed
    def get_storage_stats(self):
        '''
        Returns storage statistics
        '''
        pass
Benziane Chakib's avatar
Benziane Chakib committed
    def get_info(self):
        '''
        get info about the host
        get_cpu_stats
        get_memory_stats
        get_network_conf
        get_storage_conf
        '''
        pass




class Hypervisor(Host):
    '''
    Base interface class for all hypervisor types and libraries
    that interacts with them
    '''
Benziane Chakib's avatar
Benziane Chakib committed
    _id = 0

    def __init__(self):
        super(Hypervisor, self).__init__()
        self.__class__._id += 1
        self.hv_type = 'None'
Benziane Chakib's avatar
Benziane Chakib committed
    def list_vms(self):
        '''
        Lists current defined virtual machines in the hypervisor
        Returns a dict of vms
Benziane Chakib's avatar
Benziane Chakib committed
        '''
        pass

    def get_id(self):
        '''
        Get id of the current hypervisor
        Should always be 0
        '''
        return self._id

    def stop_vm(self, vm_name):
        '''
        Stops the given virtual machinoe

        :param vm_name: name of the VM
        :Returns: the name of the VM
        '''
        pass

class VM(Host):
    '''
    Base Virtual Machine class
    '''
    _id_count = 0
Benziane Chakib's avatar
Benziane Chakib committed
    def __init__(self):
        '''
        Initiate a Virtual Machine
        Each VM instace has a unique ID
        '''
        self.__class__._id_count += 1
        self._id = self.__class__._id_count
Benziane Chakib's avatar
Benziane Chakib committed
    def get_id(self):
        '''
        Gets the id of the virtual machine

        :Returns: :class:`int`  id of the VM
        '''
        return self._id

    def get_status(self):
        '''
        returns VM's status:
        - running
        - blocked in ressource
        - paused by user
Benziane Chakib's avatar
Benziane Chakib committed
        - is shut off
        - is crached
        '''
        pass

Benziane Chakib's avatar
Benziane Chakib committed
    def shutdown(self):
        '''
        Shut down given vm
        '''
        pass

    def suspend(self):
        '''
        Suspend vm
        '''
        pass

    def resume(self):
        '''
        Resume vm
        '''
        pass


class HVStorage(object):
    '''
    Base class representing storage interface of a hypervisor

    :param hypervisor: in instance of :class:`Hypervisor`

    '''
Benziane Chakib's avatar
Benziane Chakib committed
        '''
        Returns a dict of storage pools bound to the host
    def get_volume_names(self, pool=None):
Benziane Chakib's avatar
Benziane Chakib committed
        '''
        Returns volume names stored in this pool or all pools
Benziane Chakib's avatar
Benziane Chakib committed
        '''
        pass

    def add_pool(self, name, pool_type):
        '''
        Add new storage pool

        :param name: the name of the storage pool to add
        :type name: :class:`str`
        :param pool_type:  The type of the pool : LVM Group, Phisical Disk,
            NFS Server ...
        '''
        pass

    def del_pool(self, name):
        '''
        Delete a storage pool
        '''
        pass

    def add_volume(self, pool, name, space):
        '''
        Adds a volume to the specified pool

        :param pool: the pool in which to create the volume
        :type pool: :class:`virStoragePool`
Benziane Chakib's avatar
Benziane Chakib committed
        :param name: name of the new volume
        :type name: :class:`str`
        :param space: size of the new volume in gigabytes
        :type space: :class:`int`
        '''
        pass

    def del_volume(self, pool, name, wipe=False):
Benziane Chakib's avatar
Benziane Chakib committed
        '''
        Deletes a volume in the specified pool

        :param pool: the pool in which delete the volume
        :type pool: :class:`virStoragePool`
Benziane Chakib's avatar
Benziane Chakib committed
        :param name: the name of the volume
        :type name: :class:`str`
        '''
        pass

    def find_space(self, new_space):
Benziane Chakib's avatar
Benziane Chakib committed
        '''
        Tries to find a suitable chunk of space for volume allocation.
Benziane Chakib's avatar
Benziane Chakib committed

        :param new_space: a space size in gigabytes
        :type new_space: :class:`str`
        :return: a :class:`tuple` of best location or :class:`False` if no
            pool is suitable
    def get_pool_name(self, pool):
        '''
        Returns the name of this pool

        :param pool: the storage pool name
        :type pool: libvirt.`virStoragePool`
        :return: :class:`str` name of the pool
        '''

    def get_pool_state(self, pool):
Benziane Chakib's avatar
Benziane Chakib committed
        '''
        Returns the running state of the pool

        :param pool: the storage pool name
        :type pool: libvirt.`virStoragePool`
Thibault VINCENT's avatar
Thibault VINCENT committed
    def get_pool_space_total(self, pool):
Benziane Chakib's avatar
Benziane Chakib committed
        '''
        Returns the storage capacity of this pool in bytes
        
        :param pool: the pool to get information from
        :type pool: :class:`virStoragePool`
        :return: :class:`int` of capacity in bytes
Thibault VINCENT's avatar
Thibault VINCENT committed
    def get_pool_space_available(self, pool):
        Returns available space of this storage pool in bytes
        
        :param pool: the pool to get information from
        :type pool: :class:`virStoragePool`
        :return: :class:`int` of available free space in bytes
Thibault VINCENT's avatar
Thibault VINCENT committed
    def get_pool_space_used(self, pool):
        Returns current storage pool usage in bytes
        
        :param pool: the pool to get information from
        :type pool: :class:`virStoragePool`
        :return: :class:`int` of used space in bytes
Benziane Chakib's avatar
Benziane Chakib committed
        '''
        
    def get_volume_path(self, pool, vol_name):
        '''
        Returns the file path to the volume

        :param pool: the storage pool containing this volume
        :type pool: libvirt.`virStoragePool`
        :param volume_name: name of the pool volume
        :type volume_name: :class:`str`
        :return: :class:`str` path to the volume file
        '''
        
    def get_volume_allocation(self, pool, vol_name):
        '''
        Returns the pool space used by this volume in bytes

        :param pool: the pool containing this volume from
        :type pool: :class:`virStoragePool`
        :param vol_name: name of the volume to query
        :type vol_name: :class:`str`
        :return: :class:`int` of allocation in bytes
        '''
        
    def get_volume_capacity(self, pool, vol_name):
        '''
        Returns the capacity (usable space) of this volume in bytes

        :param pool: the pool containing this volume from
        :type pool: :class:`virStoragePool`
        :param vol_name: name of the volume to query
        :type vol_name: :class:`str`
        :return: :class:`int` of capacity in bytes
        '''