Skip to content
Snippets Groups Projects
common.py 7.54 KiB
Newer Older
Thibault VINCENT's avatar
Thibault VINCENT committed
# -*- coding: utf-8 -*-
from subprocess import Popen, PIPE, STDOUT
from multiprocessing import cpu_count
Thibault VINCENT's avatar
Thibault VINCENT committed
from platform import platform, machine, system
from socket import gethostbyaddr, gethostname
from jobs import JobManager
from lvm import LVM
from drbd import DRBDPool
    Root class for all physical or virtual machines that CloudControl Node may
    run on, or manage. It is not intended for direct usage by NodeHandler.
    Regular host with no hypervisor support, all methods defined here are
    expected to provide information to the NodeHandler.
    '''
    
    ARCH = {
        'i386' : 'x86',
        'i486' : 'x86',
        'i586' : 'x86',
        'i686' : 'x86',
        'x86_64' : 'x64',
    }
    
    def __init__(self):
        '''
        '''
        super(LocalHost, self).__init__()
        self.jobmgr = JobManager()
        self.drbdpool = DRBDPool()
        self.lvm = LVM()
Thibault VINCENT's avatar
Thibault VINCENT committed
    def scheduler_run(self):
Thibault VINCENT's avatar
Thibault VINCENT committed
        pass
    
        data = open('/sys/class/dmi/id/product_serial').read().strip()
        if data:
            serial = data
        return serial
    
    def get_hw_vendor(self):
        data = open('/sys/class/dmi/id/sys_vendor').read().strip()
        if data:
            vendor = data
        return vendor
    
    def get_hw_product(self):
        data = open('/sys/class/dmi/id/product_name').read().strip()
        if data:
            product = data
        return product
    
    def get_hw_bios(self):
        bios_ver = open('/sys/class/dmi/id/bios_version').read().strip()
        bios_date = open('/sys/class/dmi/id/bios_date').read().strip()
        if bios_ver:
            bios += bios_ver
        if bios_date:
            bios += ' (%s)' % bios_date
        if not bios:
            bios = None
Thibault VINCENT's avatar
Thibault VINCENT committed
    def get_chassis_asset(self):
        '''
        '''
        asset = None
        data = open('/sys/class/dmi/id/chassis_asset_tag').read().strip()
        if data:
            asset = data
        return asset
    
    def get_chassis_serial(self):
        '''
        '''
        serial = None
        data = open('/sys/class/dmi/id/chassis_serial').read().strip()
        if data:
            serial = data
        return serial
    
        hostname = gethostname()
        fqdn = gethostbyaddr(hostname)[0]
        result = fqdn if fqdn else hostname
        data = ' '.join(os.uname())
        if data:
            uname = data
        return uname
    
    def get_platform(self):
        result = None
        try:
            p = platform()
            if p:
                result = p
        except:
            pass
        return result
    
Thibault VINCENT's avatar
Thibault VINCENT committed
    def get_system(self):
        '''
        '''
        result = None
        try:
            p = system()
            if p:
                result = p.lower()
        except:
            pass
        return result
    
        uptime = None
        try:
            data = open("/proc/uptime").read().split()
            if data:
                uptime = int(float(data[0]))
        except:
            pass
        return uptime
    
    def get_loadavg(self):
        load = None
        try:
            data = ' '.join('%.2f' % load for load in os.getloadavg())
            if data:
                load = data
        except:
            pass
        return load
        arch = None
        try:
            a = machine()
            if a in self.ARCH:
                arch = self.ARCH[a]
        cpucount = None
        try:
            data = cpu_count()
            if data:
                cpucount = data
        except:
            pass
        return cpucount
        usage = None
        try:
            data = '%.1f' % psutil.cpu_percent()
            if data:
                usage = data
        except:
            pass
        return usage
        mem = None
        try:
            data = psutil.avail_phymem() + psutil.used_phymem()
            if data:
                mem = data
        except:
            pass
        return mem
        free = None
        try:
            data = psutil.avail_phymem()
            if data:
                free = data
        except:
            pass
        return free
        used = None
        try:
            data = psutil.used_phymem()
            if data:
                used = data
        except:
            pass
        return used
        disks = {}
        try:
            re_pattern = re.compile(r'([sh]d[a-z]+)')
            found = [bd for bd in os.listdir('/sys/block/')
                                                        if re_pattern.match(bd)]
            for disk in found:
                fullname = os.path.join('/sys/block', disk, 'size')
                size = int(open(fullname).read())
                if size > 0:
                    disks[disk] = size * 512
        except:
            pass
        return disks
    
    def power_shutdown(self):
        return self.execute('/sbin/shutdown -h -P 0')
    
    def power_off(self):
        return self.execute('/sbin/shutdown -h -P -n 0')
    
    def power_reboot(self):
        return self.execute('/sbin/shutdown -r -f 0')
    
    def power_force_reboot(self):
        return self.execute('/sbin/shutdown -r -n 0')
    
    def execute(self, command):
        output = None
        try:
            #FIXME: stop using shell=true and parse arguments with shlex.split()
            data = Popen(command,
                         shell=True,
                         bufsize=-1,
                         stdin=PIPE,
                         stdout=PIPE,
                         stderr=STDOUT).communicate()[0]
            if data:
                output = data
        except:
            pass
        return output
    def __init__(self):
        '''
        '''
        super(Hypervisor, self).__init__()
    
        raise NotImplementedError
        raise NotImplementedError
        raise NotImplementedError
        raise NotImplementedError
        raise NotImplementedError
        raise NotImplementedError


class VM(Host):
    '''
    '''


class Storage(object):
    '''
    '''


class StoragePool(object):
    '''
    '''


class StorageVolume(object):
    '''
    '''