Newer
Older
# This file is part of CloudControl.
#
# CloudControl is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# CloudControl is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with CloudControl. If not, see <http://www.gnu.org/licenses/>.
import logging
from functools import wraps
import libvirt
logger = logging.getLogger(__name__)
def _virt_tag(func):
"""Catches libvirt related exception.
Decorator used for tag declarations that interacts with libvirt.
"""
@wraps(func)
def decorated(handl):
if not handl.virt_connected:
return
try:
return func(handl)
except libvirt.libvirtError:
logger.exception('Unexpected libvirt error')
handl.vir_con_restart()
return decorated
def _check_virt_connected(func):
"""Check is libvirt is connected before caculating tag."""
@wraps(func)
def decorated(handl):
if not handl.virt_connected:
return
return func(handl)
return decorated
def vir_status(handl):
"""Local libvirt connection status."""
return {True: 'connected', False: 'disconnected'}[handl.virt_connected]
# hypervisor related tags
def htype():
"""Hypervisor type."""
# FIXME for other support
return u'kvm'
"""Hypervisor name."""
# What is the point of this tag ? if the information not already in a and id
# ?
def hvm():
"""Hardware virtualization enable."""
# see
# http://www.linux-kvm.org/page/FAQ#How_can_I_tell_if_I_have_Intel_VT_or_AMD-V.3F
# or
# http://www.cyberciti.biz/faq/linux-xen-vmware-kvm-intel-vt-amd-v-support/
# if we are in a xen hypervisor we won't see vt in /proc/cpuinfo
result = {True: u'yes', False: u'no'}
if htype() == u'kvm':
# findout in /proc/cpuinfo if all CPUs have virtualisation enabled
return result[and_(
set(
'vmx', # Intel VT
'svm', # AMD
) & set(
l.split(': ')[-1].split()
) for l in open('/proc/cpuinfo').readline() if l.startswith('Tags')
)]
return None
return handl.hypervisor.vir_con.getVersion()
"""Version of running libvirt."""
return handl.hypervisor.vir_con.getLibVersion()
# jobs
def rjobs():
"""Number of currently running jobs."""
# storage pools
return u' '.join(handl.hypervisor.storage.storages.iterkeys())
"""Number of VMS in the current hypervisor."""
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
@_check_virt_connected
def cpurunning(handl):
"""CPU total used by running VMs on the hypervisor."""
return sum(int(vm.tags['cpu'].value) for vm in
handl.hypervisor.domains.itervalues() if vm.tags['cpu'].value and
vm.state == 'running')
@_check_virt_connected
def cpualloc(handl):
"""CPU total used by all VMs on the hypervisor."""
return sum(int(vm.tags['cpu'].value) for vm in
handl.hypervisor.domains.itervalues() if vm.tags['cpu'].value)
@_check_virt_connected
def memrunning(handl):
"""Memory used by running VMs on the hypervisor."""
return sum(int(vm.tags['mem'].value) for vm in
handl.hypervisor.domains.itervalues() if vm.tags['mem'].value and
vm.state == 'running')
@_check_virt_connected
def memalloc(handl):
"""Memory used by all VMs on the hypervisor."""
return sum(int(vm.tags['mem'].value) for vm in
handl.hypervisor.domains.itervalues() if vm.tags['mem'].value)