diff options
Diffstat (limited to 'Testcases/cfgm_common/vnc_cpu_info.py')
-rw-r--r-- | Testcases/cfgm_common/vnc_cpu_info.py | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/Testcases/cfgm_common/vnc_cpu_info.py b/Testcases/cfgm_common/vnc_cpu_info.py new file mode 100644 index 0000000..d929534 --- /dev/null +++ b/Testcases/cfgm_common/vnc_cpu_info.py @@ -0,0 +1,196 @@ +# +# Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. +# + +""" +.. attention:: Fix the license string +""" +import os +import socket +import psutil +import gevent +from uve.cfgm_cpuinfo.ttypes import * +from uve.cfgm_cpuinfo.cpuinfo.ttypes import * +from buildinfo import build_info +from sandesh_common.vns.ttypes import Module +from sandesh_common.vns.constants import ModuleNames + +# CpuInfo object for config-node + + +class CpuInfo(object): + + def __init__(self, module_id, instance_id, sysinfo_req, sandesh, + time_interval, server_ip=None): + # store cpuinfo at init + self._module_id = module_id + self._instance_id = instance_id + self._sysinfo = sysinfo_req + self._sandesh = sandesh + self._time_interval = time_interval + self._rss = 0 + self._vms = 0 + self._pvms = 0 + self._load_avg = (0, 0, 0) + self._phymem_usage = (0, 0, 0, 0) + self._phymem_buffers = 0 + self._num_cpus = 0 + self._cpu_share = 0 + self._curr_build_info = None + self._new_build_info = None + self._curr_ip = server_ip + self._new_ip = None + + # spawn a Greenlet object to do periodic collect and send. + gevent.spawn(self.cpu_stats) + # end __init__ + + def get_config_node_ip(self): + return self._curr_ip + # end __get_config_ndoe_ip + + def set_config_node_ip(self, server_ip): + self._curr_ip = server_ip + # end __set_config_ndoe_ip + + def cpu_stats(self): + cfg_process = psutil.Process(os.getpid()) + while True: + # collect Vmsizes + self._ip_change = 0 + self._build_change = 0 + rss = cfg_process.get_memory_info().rss + if (self._rss != rss): + self._rss = rss + + vms = cfg_process.get_memory_info().vms + if (self._vms != vms): + self._vms = vms + + pvms = vms + if (pvms > self._pvms): + self._pvms = pvms + + if self._sysinfo: + # collect CPU Load avg + load_avg = os.getloadavg() + if (load_avg != self._load_avg): + self._load_avg = load_avg + + # collect systemmeory info + phymem_usage = psutil.phymem_usage() + if (phymem_usage != self._phymem_usage): + self._phymem_usage = phymem_usage + + phymem_buffers = psutil.phymem_buffers() + if (phymem_buffers != self._phymem_buffers): + self._phymem_buffers = phymem_buffers + + if (self._new_ip != self._curr_ip): + self._new_ip = self.get_config_node_ip() + self._ip_change = 1 + + # Retrieve build_info from package/rpm and cache it + if self._curr_build_info is None: + command = "contrail-version contrail-config | grep 'contrail-config'" + version = os.popen(command).read() + _, rpm_version, build_num = version.split() + self._new_build_info = build_info + '"build-id" : "' + \ + rpm_version + '", "build-number" : "' + \ + build_num + '"}]}' + if (self._new_build_info != self._curr_build_info): + self._curr_build_info = self._new_build_info + self._build_change = 1 + + num_cpus = psutil.NUM_CPUS + if (num_cpus != self._num_cpus): + self._num_cpus = num_cpus + + cpu_percent = cfg_process.get_cpu_percent(interval=0.1) + cpu_share = cpu_percent / num_cpus + self._cpu_share = cpu_share + + self._send_cpustats() + + gevent.sleep(self._time_interval) + # end cpu_stats + + # Send Uve Object + def _send_cpustats(self): + mod_cpu = ModuleCpuInfo() + mod_cpu.module_id = self._module_id + mod_cpu.instance_id = self._instance_id + + mod_cpu.cpu_info = CpuLoadInfo() + + # populate number of available CPU + mod_cpu.cpu_info.num_cpu = self._num_cpus + + if self._sysinfo: + # populate system memory details + mod_cpu.cpu_info.sys_mem_info = SysMemInfo() + mod_cpu.cpu_info.sys_mem_info.total = self._phymem_usage[0] / 1024 + mod_cpu.cpu_info.sys_mem_info.used = self._phymem_usage[1] / 1024 + mod_cpu.cpu_info.sys_mem_info.free = self._phymem_usage[2] / 1024 + mod_cpu.cpu_info.sys_mem_info.buffers = self._phymem_buffers / 1024 + + # populate CPU Load avg + mod_cpu.cpu_info.cpuload = CpuLoadAvg() + mod_cpu.cpu_info.cpuload.one_min_avg = self._load_avg[0] + mod_cpu.cpu_info.cpuload.five_min_avg = self._load_avg[1] + mod_cpu.cpu_info.cpuload.fifteen_min_avg = self._load_avg[2] + + # populate Virtual Memory details + mod_cpu.cpu_info.meminfo = MemInfo() + mod_cpu.cpu_info.meminfo.virt = self._vms / 1024 + mod_cpu.cpu_info.meminfo.peakvirt = self._pvms / 1024 + mod_cpu.cpu_info.meminfo.res = self._rss / 1024 + + # populate cpu_share, which is calibrated with num_cpu + mod_cpu.cpu_info.cpu_share = self._cpu_share + + cpu_load_info_list = [mod_cpu] + + cfgm_cpu_uve = ModuleCpuState(module_cpu_info=cpu_load_info_list) + cfgm_cpu_uve.name = socket.gethostname() + if self._sysinfo: + if self._ip_change: + cfgm_cpu_uve.config_node_ip = self._new_ip + if self._build_change: + cfgm_cpu_uve.build_info = self._curr_build_info + + if (self._module_id == ModuleNames[Module.API_SERVER]): + cfgm_cpu_uve.api_server_mem_virt = mod_cpu.cpu_info.meminfo.virt + cfgm_cpu_uve.api_server_cpu_share = self._cpu_share + + if (self._module_id == ModuleNames[Module.SCHEMA_TRANSFORMER]): + cfgm_cpu_uve.schema_xmer_mem_virt = mod_cpu.cpu_info.meminfo.virt + cfgm_cpu_uve.schema_xmer_cpu_share = self._cpu_share + + if (self._module_id == ModuleNames[Module.SVC_MONITOR]): + cfgm_cpu_uve.service_monitor_mem_virt =\ + mod_cpu.cpu_info.meminfo.virt + cfgm_cpu_uve.service_monitor_cpu_share = self._cpu_share + + cpu_info_trace = ModuleCpuStateTrace( + data=cfgm_cpu_uve, sandesh=self._sandesh) + cpu_info_trace.send(sandesh=self._sandesh) + + cnf_cpu_state = ConfigCpuState() + cnf_cpu_state.name = socket.gethostname() + + cnf_cpu_info = ProcessCpuInfo() + cnf_cpu_info.module_id = self._module_id + cnf_cpu_info.inst_id = self._instance_id + cnf_cpu_info.cpu_share = self._cpu_share + cnf_cpu_info.mem_virt = mod_cpu.cpu_info.meminfo.virt + cnf_cpu_info.mem_res = mod_cpu.cpu_info.meminfo.res + cnf_cpu_state.cpu_info = [cnf_cpu_info] + + cnf_cpu_state_trace = ConfigCpuStateTrace( + sandesh=self._sandesh, data=cnf_cpu_state) + cnf_cpu_state_trace.send(sandesh=self._sandesh) + + # end _send_cpustats + +# end class CpuInfo |