131 lines
3.3 KiB
Python
131 lines
3.3 KiB
Python
# Copyright 2012 Anton Beloglazov
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
""" The functions from this module are shared by other components.
|
|
"""
|
|
|
|
from contracts import contract
|
|
from neat.contracts_extra import *
|
|
|
|
import time
|
|
|
|
from neat.config import *
|
|
from neat.db_utils import *
|
|
|
|
|
|
@contract
|
|
def start(init_state, execute, config, time_interval, iterations):
|
|
""" Start the processing loop.
|
|
|
|
:param init_state: A function accepting a config and returning a state dictionary.
|
|
:type init_state: function
|
|
|
|
:param execute: A function performing the processing at each iteration.
|
|
:type execute: function
|
|
|
|
:param config: A config dictionary.
|
|
:type config: dict(str: *)
|
|
|
|
:param time_interval: The time interval to wait between iterations.
|
|
:type time_interval: int
|
|
|
|
:param iterations: The number of iterations to perform, -1 for infinite.
|
|
:type iterations: int
|
|
|
|
:return: The final state.
|
|
:rtype: dict(str: *)
|
|
"""
|
|
state = init_state(config)
|
|
|
|
if iterations == -1:
|
|
while True:
|
|
state = execute(config, state)
|
|
time.sleep(time_interval)
|
|
else:
|
|
for _ in xrange(iterations):
|
|
state = execute(config, state)
|
|
time.sleep(time_interval)
|
|
|
|
return state
|
|
|
|
|
|
@contract
|
|
def build_local_vm_path(local_data_directory):
|
|
""" Build the path to the local VM data directory.
|
|
|
|
:param local_data_directory: The base local data path.
|
|
:type local_data_directory: str
|
|
|
|
:return: The path to the local VM data directory.
|
|
:rtype: str
|
|
"""
|
|
return os.path.join(local_data_directory, 'vms')
|
|
|
|
|
|
@contract
|
|
def physical_cpu_count(vir_connection):
|
|
""" Get the number of physical CPUs using libvirt.
|
|
|
|
:param vir_connection: A libvirt connection object.
|
|
:type vir_connection: virConnect
|
|
|
|
:return: The number of physical CPUs.
|
|
:rtype: int
|
|
"""
|
|
return vir_connection.getInfo()[2]
|
|
|
|
|
|
@contract
|
|
def physical_cpu_mhz(vir_connection):
|
|
""" Get the CPU frequency in MHz using libvirt.
|
|
|
|
:param vir_connection: A libvirt connection object.
|
|
:type vir_connection: virConnect
|
|
|
|
:return: The CPU frequency in MHz.
|
|
:rtype: int
|
|
"""
|
|
return vir_connection.getInfo()[1]
|
|
|
|
|
|
@contract
|
|
def physical_cpu_mhz_total(vir_connection):
|
|
""" Get the sum of the core CPU frequencies in MHz using libvirt.
|
|
|
|
:param vir_connection: A libvirt connection object.
|
|
:type vir_connection: virConnect
|
|
|
|
:return: The total CPU frequency in MHz.
|
|
:rtype: int
|
|
"""
|
|
return physical_cpu_count(vir_connection) * physical_cpu_mhz(vir_connection)
|
|
|
|
|
|
@contract
|
|
def frange(start, end, step):
|
|
""" A range generator for floats.
|
|
|
|
:param start: The starting value.
|
|
:type start: number
|
|
|
|
:param end: The end value.
|
|
:type end: number
|
|
|
|
:param step: The step.
|
|
:type step: number
|
|
"""
|
|
while start <= end:
|
|
yield start
|
|
start += step
|