from signal import SIGTERM from threading import Thread import websocket from bat_agent.common import log from bat_agent.common.constants import Constant from bat_agent.common.util import InstanceConfigUtil from bat_agent.engine.agent import AgentService from bat_agent.listener.default_server import DefaultListenerServer from bat_agent.monitor.hypervisor import HypervisorMonitor from bat_agent.monitor.instance import InstanceMonitor from bat_agent.monitor.network import NetworkMonitor from bat_agent.notifier.send import AgentNotifier LOGGER = log.getLogger(Constant.LOGGER_RPC_SERVER) class DefaultAgentService(AgentService): """ dictionary are not immutable so danger danger """ def __init__(self, cfg): self._cfg = cfg self._instanceconfigurations = {} self._monitored_instance = {} self._monitored_network = {} self._monitored_hypervisor = {} self._failed_instances = {} self._hostname = self._cfg["Host"]["hostname"]
import sys import uuid import pika from bat_agent.common import log from bat_agent.common.constants import Constant LOGGER = log.getLogger(Constant.LOGGER_LISTENER) from bat_agent.common.constants import Constant import simplejson class AgentNotifier(object): def __init__(self, cfg, queue_section_name, hostname=None): """Setup the example publisher object, passing in the URL we will use to connect to RabbitMQ. :param str amqp_url: The URL for connecting to RabbitMQ """ self._rabbit_cfg = cfg[Constant.CONFIG_RABBIT_SECTION] self._queue_cfg = cfg[queue_section_name] self._connection = None self.response = None self.corr_id = None self._consumer_tag = None if hostname is None: self.ROUTING_KEY = self._queue_cfg['notifier_routing_key']
if os.path.exists(os.path.join(POSSIBLE_TOPDIR, 'bat_agent', '__init__.py')): sys.path.insert(0, POSSIBLE_TOPDIR) from bat_agent.monitor.daemon import batMonitorDaemon import time from bat_agent.common.constants import Constant from bat_agent.notifier import send from bat_agent.rules import instance from bat_agent.common import log from bat_agent.common.util import AgentConfigParser import json from bat_agent.rpcclient.api import API import timeit LOGGER = log.getLogger(Constant.LOGGER_MONITOR) class HypervisorMonitor(batMonitorDaemon): def __init__(self, pidfile, instance_configuration_json, cfg): batMonitorDaemon.__init__(self, pidfile, instance_configuration_json) self._cfg = cfg def run(self): LOGGER.info("Running hypervisor monitor for instance %s" % self._instance_id_to_monitor) if self._instance_configuration_json is None: LOGGER.error("Instance %s configuration is missing during monitoring") else: try: hostname = self._hypervisor_to_monitor["hostname"] url = "ws://" + hostname + ":3000/events"
import sys import time import os import atexit from signal import SIGTERM from bat_agent.common import log from bat_agent.common.constants import Constant LOGGER = log.getLogger(Constant.LOGGER_RPC_SERVER) class batRPCDaemon: """ A generic daemon class. Usage: subclass the Daemon class and override the run() method """ startmsg = "RPC server started with pid %s" """ A generic daemon class. Usage: subclass the Daemon class and override the run() method """ def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): self.stdin = stdin self.stdout = stdout self.stderr = stderr self.pidfile = pidfile
import json import os import sys import time from bat_agent.common import log from bat_agent.common.constants import Constant from bat_agent.common.util import AgentConfigParser from bat_agent.rpcclient.api import API LOGGER = log.getLogger(Constant.LOGGER_MONITOR) EVENT_LOGGER = log.getLogger(Constant.LOGGER_EVENT) class Rules(): @staticmethod def publish(routing_key, jsondata, instances=None, notifier=None): if notifier is not None: notifier.reinit(routing_key, '', '') if instances is not None: notifier.notify({"return_code": 501, "id": instances["id"], "message": jsondata}) else: notifier.notify({"return_code": 501, "id": jsondata, "message": jsondata}) @staticmethod def shutdown_monitoring(instanceid, jsondata, instances=None, notifier=None): cfg = AgentConfigParser() cfg.read(os.path.abspath(os.path.join(os.path.dirname(__file__), '../config.cfg'))) cfg = cfg.as_dic() LOGGER.info(cfg)
# it will override what happens to be installed in /usr/(local/)lib/python... POSSIBLE_TOPDIR = os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir, os.pardir, os.pardir)) if os.path.exists(os.path.join(POSSIBLE_TOPDIR, 'bat_agent', '__init__.py')): sys.path.insert(0, POSSIBLE_TOPDIR) from bat_agent.monitor.daemon import batMonitorDaemon import time from bat_agent.common.constants import Constant from bat_agent.common import log from bat_agent.common.util import AgentConfigParser from bat_agent.notifier import send from bat_agent.rules import instance import string LOGGER = log.getLogger(Constant.LOGGER_MONITOR) FAILURE_LOGGER = log.getLogger(Constant.LOGGER_FAILURE) class NetworkMonitor(batMonitorDaemon): def __init__(self, pidfile, instance_configuration_json, cfg): batMonitorDaemon.__init__(self, pidfile, instance_configuration_json) self._cfg = cfg # # Right now we are monitoring tap interfaces going down. We may need to monitor # an actual physical interface (like FTCore does for KVM-FT). If we need to # monitor an actual physical interface, we can always open the /etc/nova/kvmax.conf # file and extract it from there. Of course, in that case, all network monitoring # processes create by a particular bat agent will be monitoring the same # interface, so perhaps then it would be advantageous to rearchitect this piece
import simplejson import pika from bat_agent.common import log from bat_agent.common.constants import Constant from bat_agent.engine.default_agent import DefaultAgentService from bat_agent.rpcserver.daemon import batRPCDaemon from bat_agent.rpcserver.endpoint import RPCEndpoint from bat_agent.rpcserver.server import RPCServer LOGGER = log.getLogger(Constant.LOGGER_RPC_SERVER) EVENT_LOGGER = log.getLogger(Constant.LOGGER_EVENT) class DefaultRPCServer(batRPCDaemon, RPCServer): def __init__(self, cfg, log_name=None): batRPCDaemon.__init__(self, cfg[Constant.CONFIG_PIDFILE_SECTION]["server"]) RPCServer.__init__(self, cfg) self.cfg = cfg self._defaultagentservice = DefaultAgentService(cfg) def run(self): self.start_rpc() def getconfig(self, instanceid): return self._defaultagentservice.getconfig() def getagentconfig(self, dummy=None): return self.cfg
import simplejson import pika from bat_agent.common import log from bat_agent.common.constants import Constant from bat_agent.engine.default_agent import DefaultAgentService from bat_agent.rpcserver.daemon import batRPCDaemon from bat_agent.rpcserver.endpoint import RPCEndpoint from bat_agent.rpcserver.server import RPCServer LOGGER = log.getLogger(Constant.LOGGER_RPC_SERVER) EVENT_LOGGER = log.getLogger(Constant.LOGGER_EVENT) class DefaultRPCServer(batRPCDaemon, RPCServer): def __init__(self, cfg, log_name=None): batRPCDaemon.__init__(self, cfg[Constant.CONFIG_PIDFILE_SECTION]["server"]) RPCServer.__init__(self, cfg) self.cfg = cfg self._defaultagentservice = DefaultAgentService(cfg) def run(self): self.start_rpc() def getconfig(self, instanceid): return self._defaultagentservice.getconfig() def getagentconfig(self, dummy=None):