File: //usr/local/qcloud/monitor/barad/plugin/base/plugin_base.py
import logging
import sys
import traceback
import commands
from abc import ABCMeta, abstractmethod
from cutils import console_logger, generate_config, is_metal, CommUtils, is_minios
import constant
import urllib2
import re
import time,threading
import datetime
import os
import subprocess
sys.path.append(os.getcwd()+"/../comm/")
sys.path.append(os.getcwd()+"/../plugin/collector/utils/")
import cutils
from utils.collect_vm_msg import CollectVmMesg
class BaseSender(object):
def __init__(self, logger = None):
#print self.__class__.__module__, self.__class__.__name__
self.__config = generate_config(constant.PLUGIN_CONFIG_PATH, self.__class__.__name__)
self.__logger = logger if logger is not None else console_logger()
self.init()
def get_config(self, key):
return self.__config[key]
def logger(self):
return self.__logger
'''
for sender plugins please override the 'send_data' function
'''
def init(self):
pass
def send_data(self, data):
pass
class BaseCollector(object):
__metaclass__ = ABCMeta
def __init__(self, executor = None):
self.__executor = executor
self.__frequency = 60
self.__collect_list = []
self.__logger = executor.logger() if executor is not None else console_logger()
self.__config = generate_config(constant.PLUGIN_CONFIG_PATH,"MetaDataServer")
self.init()
def set_frequency(self, freq):
self.__frequency = freq
def frequency(self):
return self.__frequency
def get_config(self, key):
return self.__config[key]
def logger(self):
return self.__logger
def collect(self):
self.__collect_list = []
try:
self.do_collect()
except Exception,e:
error = traceback.format_exc().replace("\n","\\n")
self.__logger.error(error)
try:
if self.__executor is not None:
self.__executor.put_data(self.get_data())
except Exception,e:
error = traceback.format_exc().replace("\n","\\n")
self.__logger.error(error)
def put_data(self, data):
if isinstance(data,list):
self.__collect_list += data
else:
self.__collect_list.append(data)
def get_data(self):
return self.__collect_list
def dump_data(self):
import json
print json.dumps(self.__collect_list, indent = 4)
'''
for collector plugins please override these functions below
'''
@abstractmethod
def do_collect(self):
'''
call push_data function to fill your data
the data format is :
{ 'sender':'sender_plugin_name', 'datas':[{}, {}, {}] }
'''
pass
@abstractmethod
def init(self):
'''
do some initialized job
'''
pass
class VmBaseCollector(BaseCollector):
def __init__(self, executor = None):
self.metadata_instance = CollectVmMesg()
super(VmBaseCollector, self).__init__(executor)
self.logger().info("CollectVmMesg id is %s"%self.metadata_instance)
def get_vm_project_id(self):
return 0
def get_vm_instance_id(self):
return self.metadata_instance.get_vm_instance_id()
def get_vm_app_id(self):
return self.metadata_instance.get_vm_app_id()
def get_diskid(self, serial):
return self.metadata_instance.get_diskid(serial)
def get_cbs_diskid(self, serial):
return self.metadata_instance.get_cbs_diskid(serial)
def get_sn(self):
return self.metadata_instance.get_sn()
def get_ntp_server(self):
return self.metadata_instance.get_ntp_server()
def get_vm_uuid(self):
return self.metadata_instance.get_vm_uuid()
def get_vmip(self):
return self.metadata_instance.get_vmip()
def get_lanip(self):
return self.metadata_instance.get_lanip()
def set_ntptime_offset(self,offset):
return self.metadata_instance.set_ntptime_offset(offset)
def get_ntptime_offset(self):
return self.metadata_instance.get_ntptime_offset()
def get_barad_version(self):
return self.metadata_instance.get_barad_version()
def get_vm_region(self):
return self.metadata_instance.get_vm_region()
class HostBaseCollector(BaseCollector):
"""
the abstract common collector
"""
__metaclass__ = ABCMeta
MSG_VMM_BASE_INFO = 1
MSG_VMM_NETWORK_INFO = 2
MSG_VMM_STORAGE_INFO = 3
MSG_VM_BASE_INFO = 4
MSG_VM_NETWORK_INFO = 5
MSG_VM_STORAGE_INFO = 6
MSG_VM_CPU_INFO = 7
MSG_VMM_CHILDREN_INFO = 8
def __init__(self, executor = None):
super(HostBaseCollector, self).__init__(executor)